C++----动态内存

C++中的动态内存管理可通过智能指针shared_ptr和unique_ptr实现。shared_ptr允许多个指针指向同一对象,通过make_shared函数安全地分配内存,拷贝或赋值时会更新引用计数。unique_ptr则独占所指向的对象,不支持拷贝和赋值,但可以reset释放内存。此外,weak_ptr作为弱引用,不增加引用计数。
摘要由CSDN通过智能技术生成

除了自动和static对象外,C++还支持动态分配内存对象。动态分配的对象的生存期与它们在哪里创建时无关的,只有当显示地被释放时,这些对象才会销毁。
动态对象的正确释放被证明是编程中及其容易出错的地方。为了更安全地使用动态对象,标准库定义了两个智能指针类型来管理动态分配的对象。当一个对象应该被释放时,指向它的智能指针可以确保自动地释放它。
为了更容易(同时也更安全)地使用动态内存,新的标准库提供了两种智能指针(smart pointer)类型来管理动态对象。新标准库提供的这两种智能指针的区别在于管理低层指针的方式:
shared_ptr允许多个指针指向同一个对象;unique_ptr则“独占”所指向的对象。标准库还定义了一个名为weak_ptr的伴随类。它是一种弱引用,指向shared_ptr所管理的对象。这三种类型都定义在memory头文件中。

shared_ptr类

make_shared函数

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

//指向一个值为42的int的shared_ptr
shared_ptr<int> p3 = make_shared<int>(42);
//指向一个值为“9999999999”的string
shared_ptr<string> p4 = make_shared<string>(10,'9');
//p5指向一个值初始化的int,即,值为0
shared_ptr<int> p5 = make_shared<int>();

shared_ptr的拷贝和赋值

当进行拷贝或赋值操作时,每个shared_ptr都会记录有多少个其他shared_ptr指向相同的对象:

auto p = make_shared<int>(42);//p指向的对象只有一个引用者
auto q(p);//pq指向相同对象,次对象有两个引用者

我们可以认为每个shared_ptr都有一个关联的计数器,通常称其为引用计数(reference count)。无论何时我们拷贝一个shared_ptr,计数器都会递增。当我们给shared_ptr赋予一个新值或是shared_ptr被销毁(例如一个局部的shared_ptr离开作用域)时,计数器就会递减。
一旦一个shared_ptr的计数器变为0,它就会自动释放自己所管理的对象。

直接管理内存

C++语言定义了两个元素符来分配和释放动态内存。运算符new分配内存,delete释放new分配额内存。
如果我们提供了一个括号包围的初始化器,就可以使用auto从此初始化器来推断我们想要分配的对象的类型。但是,由于编译器要用初始化器类型来推断要分配的类型,只有当括号中仅有单一初始化器时才可以使用auto。

auto p1 = new auto(obj);//p指向一个与obj类型相同的对象
auto p1 = new auto{a,b,c};//错误

动态分配的const对象

用new分配const对象是合法的:

//分配并初始化一个const int
const int *pci = new const int(1024);
//分配并默认初始化一个const的空string
const string *pcs = new cosnt string;

类似其他任何const对象,一个动态分配的const对象必须进行初始化。对于一个定义了默认构造函数的类类型,其const动态对象可以隐式初始化,而其他类型的对象就必须显示初始化。

释放动态内容

delete p;

销毁给定的指针指向的对象、释放对应的内存。

unique_ptr

与shared_ptr不同,某个时刻智能有一个unique_ptr指向一个给定对象。当unique_ptr被销毁时,它所是想的对象也被销毁。与shared_ptr不同,没有类似make_shared的标准库函数返回一个unique_ptr。当我们定义一个unique_ptr时,需要将其绑定到一个new返回的指针上。类似shared_ptr,初始化unique_ptr必须采用直接初始化形式:

unique_ptr<double> p1;//可以指向一个double的unique_ptr
unique_ptr<int> p2(new int(42));

由于一个unique_ptr拥有它指向的对象,因此unique_ptr不支持普通的拷贝或赋值操作:

unique_ptr<string> p1(new string("Stedasdas"));
unique_ptr<string> p2(p1);// wrong;
unique_ptr<string> p3;
p3 = p2;//wrong

但是可以:

unique_ptr<string> p2(p1.release());//realse将p1置为空,所有权转移给p2
unique_ptr<string> p3(new string("Trex"));
p2.reset(p3.release());//reset释放了p2原来指向的内存,所有权给p2

reset参数可选,没有就释放原本的内存。

weak_ptr

指向由shared_ptr管理的对象,但是不增加引用数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值