《c++ primer》第五版 第十二章 动态内存

本文详细介绍了C++中的动态内存管理,包括动态分配与释放对象、智能指针的作用以及如何避免内存泄露。重点讲解了new运算符用于动态内存分配,delete用于释放内存,以及share_ptr、unique_ptr和weak_ptr这三种智能指针类型。智能指针能自动管理动态内存,防止内存泄露。特别提到了make_shared函数的安全使用以及动态内存与各种指针类型的交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

全局对象在程序启动时分配,在程序结束时销毁。

局部对象,当我们进入其所在的程序块时被创建,在离开块时被销毁。

局部static对象,在第一次使用前分配,在程序结束时销毁。

动态分配对象时,它的生存期与他们在哪里创建是无关的,只有当显式的被释放时,这些对象才能被销毁。

为了更安全使用动态对象,标准库定义了两个智能指针类型来管理动态分配的对象,当一个对象应该被释放的时候,指向他的智能指针可以确保自动的释放他。

程序用堆来存储动态分配的对象

静态内存用来保存局部static对象,类static数据成员,以及定义在任何函数之外的变量

栈内存用来保存在函数内的非static对象。分配在静态内存或者栈内存中的对象由编译器自动创建和销毁。

动态内存的管理通过一对运算符来完成:

new:在动态内存中为对象分配空间并返回一个指向该对象的指针,我们可以选择对对象进行初始化。

delete:接受一个动态对象的指针,销毁该对象,并释放与之关联的内存。

内存泄露:忘记释放内存的时候,

智能指针:智能指针类似常规指针,区别在于:它自动释放所指向的对象

新标准提供了两种智能指针,其区别在于管理底层指针的方式:share_ptr允许多个指针指向同一个对象,unique_ptr则独占所指向的对象,

weak_ptr:伴随类,是弱引用。这三种类型都指向memory头文件中。

最安全的分配和使用动态内存的方法是调用一个名为make_shared的标准库函数,此函数在动态内存中分配一个对象并且初始化他,返回指向此对象的share_ptr,

share_ptr<int> p3=make_shared<int>(42);

我们可以认为每一个share_ptr都有一个关联的计数器,通常称其为引用计数,当其计数器为零的时候,他就会自动释放自己所管理的对象。

当指向一个对象的最后一个share_ptr被销毁的时候,他就会自动的销毁此对象,它是通过另一个特殊的成员函数--析构函数完成销毁工作的。析构函数控制此类型的对象销毁时做什么工作。

析构函数一般用来释放对象所分配的资源。

string *ps=new string;//初始化为空string

int *pi=new int(1024);//pi指向值为1024的int

auto p1=new auto(obj);//p指向一个与obj类型相同的对象

当使用auto的时候,我们是通过初始化器来推断类型的,所以,只有当括号中仅有单一一个初始化器的时候才可以使用auto;

const int *ps=new const (1024);

const string *ps=new const string;

我们不能讲一个内置类型指针转换成一个智能指针,必须使用直接初始化形式来初始化一个智能指针

share_ptr<int> p1=new int(1024);//错误,必须使用直接初始化形式

share_ptr<int> p2(new int (1024));

与share_ptr不同,没有类似make_shared的标准库函数返回一个unique_str,当我们定义一个unique_str时候,需要将其绑定到一个new返回的指针上,初始化unique_str必须采用直接初始化的形式

。。。。。。。

未完待续。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值