凡科网做的网站,顺德网站制作案例教程,网页设计的优缺点,彩票网站 模块参考资料 #xff1a;阿秀、代码随想录 智能指针是一个类#xff0c;用于存储指向动态分配对象的指针#xff0c;负责自动释放动态分配的对象#xff0c;防止堆内存泄露。动态分配的资源#xff0c;交给一个类对象去管理#xff0c;当类对象声明周期结束时#xff0c;自…参考资料 阿秀、代码随想录 智能指针是一个类用于存储指向动态分配对象的指针负责自动释放动态分配的对象防止堆内存泄露。动态分配的资源交给一个类对象去管理当类对象声明周期结束时自动调用析构函数释放资源。 C11提供了两种智能指针两种智能指针的区别在于管理底层指针的方式shared_ptr允许多个指针指向同一个对象unique_ptr则“独占”所指向的对象。标准库还定义了一个名为weak_ptr的伴随类是一种弱引用指向shared_ptr所管理的对象。
一、 shared_ptr 采⽤引用计数器的方法允许多个智能指针指向同⼀个对象每当多⼀个指针指向该对象时指向该对象的所有智能指针内部的引用计数加1每当减少⼀个智能指针指向对象时引用计数会减1当计数为0的时候会自动的释放动态分配的资源。
1. 使用方法
创建智能指针需要给出指针可以指向的类型
// 创建智能指针
shared_ptrstring p1; // 指向string
shared_ptrlistint p2; // 指向int的list 分配和使用动态内存 make_sharedT(args)
shared_ptrstring p3 make_sharedstring(10,9); // 指向一个值为“9999999999”的字符串
2. 线程安全问题
1同⼀个shared_ptr被多个线程“读”是安全的;
2同⼀个shared_ptr被多个线程“写”是不安全的;
3共享引用计数的不同的shared_ptr被多个线程”写“ 是安全的。
二、 unique_ptr 采用独享所有权语义⼀个非空的unique_ptr总是拥有它所指向的资源。转移⼀个unique_ptr将会把所有权全部从源指针转移给目标指针源指针被置空所以unique_ptr不支持普通拷贝和赋值操作不能用在 STL标准容器中局部变量的返回值除外因为编译器知道要返回的对象将要被销毁如果你拷贝⼀个unique_ptr那么拷贝结束后这两个unique_ptr都会指向相同的资源造成在结束时对同⼀内存指针多次释放而导致程序崩溃。
1. 创建unique_ptr 定义unique_ptr时需要将其绑定到一个new返回的指针上初始化unique_ptr必须采用直接初始化形式。
unique_ptrstring p1;
unique_ptrint p2(new int(42)); // p2指向一个值为42的int
2. realese/reset 虽然不能够拷贝或赋值unique_ptr但是可以通过调用release和reset将指针的所有权从一个非constunique_ptr转移给另一个unique
unique_ptrstring p2(p1.release()); // release将p1置空unique_ptrstring p3(new string(Chesnut));
// 将所有权从p3转移给p2
p2.reset(p3.release()); // reset释放p2原本指向空间
3. 传递unique_ptr参数和返回unique_ptr 不能拷贝unique_ptr的规则有一个例外 可以拷贝或赋值一个将要被销毁的unique_ptr。最常见的例子就是从函数返回一个unique_ptr。
unique_ptrint clone(int p){return unique_ptrint(new int(p));
}
三、 weak_ptr 弱引用 引用计数有⼀个问题就是互相引⽤形成环环形引用这样两个指针指向的内存都无法释 放需要使用weak_ptr打破环形引用。 weak_ptr是⼀个弱引用它是为了配合shared_ptr而引⼊的⼀种智能指针它指向⼀个由shared_ptr管理的对象而不影响所指对象的生命周期也就是说它只引用不计数。如果⼀块 内存被shared_ptr和weak_ptr同时引⽤当所有shared_ptr析构了之后不管还有没有weak_ptr引⽤该内存内存也会被释放。所以weak_ptr不保证它指向的内存⼀定是有效的在使用之前使⽤函数lock()检查weak_ptr是否为空指针。