【C++】基础:动态内存与智能指针

news2024/9/28 23:29:11

😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍动态内存与智能指针。
学其所用,用其所学。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞

文章目录

    • :smirk:1. 知识介绍
    • :blush:2. 动态内存与示例
    • :satisfied:3. 智能指针与示例

😏1. 知识介绍

C++程序中的内存分为两个部分:(在函数内部声明的所有变量都将使用栈内存)和(程序中未使用的内存,在程序运行时可用于动态分配内存)。

C++ 中,可以使用newdelete运算符为给定类型的变量在运行时分配堆内的内存,这会返回所分配的空间地址。

malloc() 函数在 C 语言中就出现了,在 C++ 中仍然存在,但建议尽量不使用 malloc() 函数。new 与 malloc() 函数相比,其主要的优点是,new 不只是分配了内存,它还创建了对象。

😊2. 动态内存与示例

C++中的动态内存分配是一种在程序运行时按需分配和释放内存的机制。与静态内存(由编译器在编译时分配)和自动内存(由编译器在函数调用时自动分配和释放)不同,动态内存提供了更大的灵活性和控制能力。

动态内存管理需要特别注意以下几点:

  • 必须手动释放通过 new 分配的内存,以防止内存泄漏。
  • 不能重复释放已经释放的内存,这会导致未定义的行为。
  • 动态分配的内存应该在不再使用时及时释放,以避免内存泄漏和资源浪费。

使用动态内存分配时,请确保谨慎操作,避免内存泄漏和悬空指针等问题,并根据需要及时释放动态分配的内存。

double变量示例:

#include <iostream>
using namespace std;
 
int main ()
{
   double* pvalue  = NULL; // 初始化为 null 的指针
   pvalue  = new double;   // 为变量请求内存
 
   *pvalue = 29494.99;     // 在分配的地址存储值
   cout << "Value of pvalue : " << *pvalue << endl;
 
   delete pvalue;         // 释放内存
 
   return 0;
}

二维数组示例:

#include <iostream>
using namespace std;
 
int main()
{
    int **p;   
    int i,j;   //p[4][8] 
    //开始分配4行8列的二维数据   
    p = new int *[4];
    for(i=0;i<4;i++){
        p[i]=new int [8];
    }
 
    for(i=0; i<4; i++){
        for(j=0; j<8; j++){
            p[i][j] = j*i;
        }
    }   
    //打印数据   
    for(i=0; i<4; i++){
        for(j=0; j<8; j++)     
        {   
            if(j==0) cout<<endl;   
            cout<<p[i][j]<<"\t";   
        }
    }   
    //开始释放申请的堆   
    for(i=0; i<4; i++){
        delete [] p[i];   
    }
    delete [] p;   
    return 0;
}

对象创建示例:

#include <iostream>
using namespace std;
 
class Box
{
   public:
      Box() { 
         cout << "调用构造函数!" <<endl; 
      }
      ~Box() { 
         cout << "调用析构函数!" <<endl; 
      }
};
 
int main( )
{
   Box* myBoxArray = new Box[4];
 
   delete [] myBoxArray; // 删除数组
   return 0;
}

😆3. 智能指针与示例

C++智能指针是一种用于自动管理动态分配的内存的指针类模板。它们提供了更安全和方便的方式来管理动态内存,减少内存泄漏和悬空指针等问题。

C++标准库中提供了三种智能指针:std::unique_ptrstd::shared_ptrstd::weak_ptr

std::unique_ptr 是 C++11 引入的智能指针,它具有独占性质。一个 std::unique_ptr 拥有对其所指向对象的唯一所有权,并在其生命周期结束时自动释放内存。

#include <memory>

void uniquePtrExample() {
    std::unique_ptr<int> ptr = std::make_unique<int>(42);
    std::cout << *ptr << std::endl;  // 输出: 42
    // 不需要手动释放内存,当 unique_ptr 离开作用域时会自动释放内存
}

std::shared_ptr 是 C++11 引入的智能指针,可以共享对象的所有权。多个 std::shared_ptr 对象可以同时拥有对同一个对象的所有权,并且会跟踪引用计数。只有当所有 std::shared_ptr 对象都释放了其对对象的所有权时,该对象才会被销毁。

#include <memory>

void sharedPtrExample() {
    std::shared_ptr<int> ptr1 = std::make_shared<int>(42);
    std::shared_ptr<int> ptr2 = ptr1;
    std::cout << *ptr1 << " " << *ptr2 << std::endl;  // 输出: 42 42
    // 不需要手动释放内存,当所有 shared_ptr 离开作用域后才会自动释放内存
}

std::weak_ptr 也是 C++11 引入的智能指针,它用于解决 std::shared_ptr 的循环引用问题。std::weak_ptr 允许你观测一个对象,但不拥有它,因此不会增加引用计数。可以使用 std::weak_ptr 来检查所观测的对象是否已被销毁。

#include <memory>

void weakPtrExample() {
    std::shared_ptr<int> sharedPtr = std::make_shared<int>(42);
    std::weak_ptr<int> weakPtr = sharedPtr;

    if (auto ptr = weakPtr.lock()) {
        // weak_ptr 可以被成功转换为 shared_ptr,表示所观测的对象还存在
        std::cout << *ptr << std::endl;  // 输出: 42
    } else {
        // 所观测的对象已经被销毁
        std::cout << "对象已被销毁" << std::endl;
    }
}

使用智能指针可以简化动态内存管理,减少手动释放内存的繁琐和错误。智能指针的选择取决于具体的需求,例如独占所有权或共享所有权。使用智能指针还可以避免循环引用导致的内存泄漏。

在这里插入图片描述

以上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/906610.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

57从零开始学Java之一文详解String字符串的底层实现原理

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在之前的两篇文章中&#xff0c;壹哥给大家介绍了String字符串及其常用的API方法、常用编码、正则表达…

rfc7234之http缓存

缓存概念 缓存处理请求步骤 缓存如果查询到某个请求已经有缓存&#xff0c;那么需要进一步检查该资源的新鲜度&#xff0c;根据新鲜度和请求中的字段综合评估是否要去服务端拉取新鲜的资源。 注意&#xff1a; 创建响应时候要注意版本匹配&#xff0c;如果服务器响应和客户端…

计算机竞赛 垃圾邮件(短信)分类算法实现 机器学习 深度学习

文章目录 0 前言2 垃圾短信/邮件 分类算法 原理2.1 常用的分类器 - 贝叶斯分类器 3 数据集介绍4 数据预处理5 特征提取6 训练分类器7 综合测试结果8 其他模型方法9 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 垃圾邮件(短信)分类算…

docker 03(docker 容器的数据卷)

一、数据卷的概念和作用 删除后&#xff0c;数据也没了。 不能 数据卷 是宿主机中的一个目录或文件当容器目录和数据卷目录绑定后&#xff0c;对方的修改会立即同步一个数据卷可以被多个容器同时挂载 作用&#xff1a; 容器数据持久化 外部机器和容器间接通信 容器之间数据交换…

数据结构(2)

冒泡排序&#xff1a; 1.比较相邻的两个元素。如果前一个元素比后一个元素大&#xff0c;则交换两者位置。 2.对每一对相邻元素做相同工作&#xff0c;从第一对元素到最后一对元素&#xff0c;最后的一个元素就是最大的元素。 for(int ia.length-1;i>0;i--){for (int j 0…

Canvas绘制毛玻璃背景分享海报

最近重新设计了分享海报&#xff0c;用毛玻璃作为背景&#xff0c;使整体更有质感&#xff0c;如果没有用到canvas&#xff0c;毛玻璃效果其实很好实现&#xff0c;给元素添加一个滤镜即可&#xff08;比如&#xff1a;filter: blur(32px)&#xff09;&#xff0c;但是实践的过…

HTTPS代理搭建技巧分享

今天我们来分享一下如何搭建一个能够实现中间人 检测和防护的HTTPS代理。保护我们的网络通信安全是至关重要的&#xff0c;让我们一起学习如何构建一个安全可靠的HTTPS代理吧&#xff01; 什么是中间人 &#xff1f; 首先&#xff0c;让我们来了解一下什么是中间人 。中间人 是…

html表格中加入斜线,使用css给table表格表头单元格添加斜线

背景&#xff1a;业务给了90张word电子表格&#xff0c;需要用html设计出来。 如图所示&#xff0c;红色区域的下斜线如何实现&#xff1f; 先说结论&#xff1a;html中table没有直接的斜线表头标签&#xff0c;但结合css、svg之类的可以实现。 #lineTd{ background:#FFFFFF u…

Leetcode67 二进制求和

给你两个二进制字符串 a 和 b &#xff0c;以二进制字符串的形式返回它们的和。 代码 class Solution {public String addBinary(String a, String b) {StringBuilder res new StringBuilder();int carry 0;int i a.length() - 1, j b.length() - 1;while(i > 0 || j &…

『吴秋霖赠书活动 | 第一期』《强化学习:原理与Python实战》

文章目录 一、什么是RLHF&#xff1f;二、RLHF适用于哪些任务&#xff1f;三、RLHF和其他构建奖励模型的方法相比有何优劣&#xff1f;四、什么样的人类反馈才是好的反馈五、RLHF算法有哪些类别&#xff0c;各有什么优缺点&#xff1f;七、如何降低人类反馈带来的负面影响&…

2021电赛国一智能送药小车(F题)设计报告

2021电赛国一智能送药小车&#xff08;F题&#xff09;设计报告 【写在前面的话】 电赛是一个很奇妙的过程&#xff0c;可能有些人觉得电赛的门槛太高&#xff0c;那便意味着&#xff0c;当你决定要参加电赛的那一刻起&#xff0c;这一段路、这些日子就注定不会太轻松&#xf…

WPS中的表格错乱少行

用Office word编辑的文档里面包含表格是正常的&#xff0c;但用WPS打开里面的表格就是错乱的&#xff0c;比如表格位置不对&#xff0c;或者是表格的前几行无法显示、丢失了。 有一种可能的原因是&#xff1a; 表格属性里面的文字环绕选成了“环绕”而非“无”&#xff0c;改…

周易卦爻解读笔记——既济

第六十三卦既济 水火既济 坎上离下 既济卦由泰卦所变&#xff0c;泰卦六五与九二换位&#xff0c;象征已经完成。 地天泰 序卦传【有过物者必济&#xff0c;故受之以既济】 既&#xff0c;已经。《谷梁传》云&#xff1a;“既者&#xff0c;尽也。有继之辞也。”济者&#…

DNDC模型建模方法及在土壤碳储量、温室气体排放、农田减排、土地变化、气候变化中的应用

第一讲 DNDC模型介绍 ①碳循环模型简介 ②DNDC模型原理 ③DNDC下载与安装 ④DNDC注意事项 第二讲 DNDC初步操作 ①DNDC界面介绍 ②DNDC数据及格式 ③DNDC点尺度模拟 ④DNDC区域尺度模拟 ⑤DNDC结果查看 第三讲 遥感和GIS基础 ①DNDC中的遥感和GIS技术 ②ArcGIS软件界面 ③坐…

【开发笔记】ubuntu部署指定版本的前后端运行环境(npm nodejs mysql)

目录 1 背景2 环境要求3 部署流程3.1 npm的安装3.2 nodejs的安装3.3 MySQL的安装 4 可能的问题 1 背景 在远程服务器上的Ubuntu系统中&#xff0c;部署指定版本的前后端项目的运行环境 2 环境要求 npm 9.5.1Nodejs v18.16.1MySQL 8.0.33 3 部署流程 3.1 npm的安装 通过安…

docker导出、导入镜像、提交

导出镜像到本地&#xff0c;然后可以通过压缩包的方式传输。 导出&#xff1a;docker image save 镜像名:版本号 > /home/quxiao/javatest.tgz 导入&#xff1a;docker image load -i /home/quxiao/javatest.tgz 删除镜像就得先删除容器&#xff0c;当你每运行一次镜像&…

【三】关系模型 -- 基本概念

基本概念关系模型概述关系模型的提出关系模型研究什么关系模型的三要素 什么是关系概念引入1. 域2. 笛卡尔积3. 关系 关系模式 VS 关系关系的特性1. 列是同质2. R(A:D) 中&#xff0c;A 不可相同&#xff0c;D 可相同3. 行、列位置互换性4. 属性不可再分&#xff08;关系第一范…

用yolov4-tiny检测在电力输电线20种鸟类,灵活运用训练trick,实验较为完备,数据处理丰富度值得参考

Detection of bird species related to transmission line faults based on lightweight convolutional neural network Abstract 输电线路高效防鸟害是电网运行维护面临的长期挑战。本文提出了一种将轻量级卷积神经网络(CNN)、图像处理和目标检测相结合的方法来检测与输电线路…

基于GPT-4和LangChain构建云端定制化PDF知识库AI聊天机器人

参考&#xff1a; GitHub - mayooear/gpt4-pdf-chatbot-langchain: GPT4 & LangChain Chatbot for large PDF docs 1.摘要&#xff1a; 使用新的GPT-4 api为多个大型PDF文件构建chatGPT聊天机器人。 使用的技术栈包括LangChain, Pinecone, Typescript, Openai和Next.js…

Day12-2-面向对象编程

Day12-面向对象编程 一 回顾 变量,数组,对象都是容器,都可以用来存储数据 let n = 10 let arr = [3,5,7] let stu = {name:"张恒",age:18,sex:"女"}二 面向对象思想 面向过程:将开发的步骤按照顺序一步一步往下执行,直到程序结束 面向对象:将项目中…