一、产生的原因 shared_ptr的产生与unique_ptr类似,都是为了解决raw pointer的new和delete的成对使用,导致的野指针、内存泄漏、重复释放内存等。 不过shared_ptr与unique_ptr场景又有所不同,这里主要是一个raw pointer在不同的代码块之间传来传去的场景,或者指针指向的内存比较大,这段内存可以切分成很多小部分,但是...
}//初始化智能指针,并自定义释放规则shared_ptr<int> p7(newint[10], deleteInt);//lambda 表达式, 初始化 p7shared_ptr<int> p7(newint[10], [](int* p){delete[]p; });return0; } 作为智能指针的一种,unique_ptr 指针自然也具备“在适当时机自动释放堆内存空间”的能力。和 shared_ptr 指针最大...
\4) 在初始化 shared_ptr 智能指针时,还可以自定义所指堆内存的释放规则,这样当堆内存的引用计数为 0 时,会优先调用我们自定义的释放规则。 在某些场景中,自定义释放规则是很有必要的。比如,对于申请的动态数组来说,shared_ptr 指针默认的释放规则是不支持释放数组的,只能自定义对应的释放规则,才能正确地释放申请...
2、在类里面返回一个管理这当前对象指针的智能指针对象,如下写法依然出现内存重复释放,原因和上面一样。 class A { public: A() { cout << "A的默认构造" << endl; } shared_ptr<A> getshareptr() { return shared_ptr<A>(this); } ~A() { cout << "A的析构函数" << endl; } }; void t...
这种情况下就不会存在内存重复释放的的情况。问题2: shared_ptr是如何实现这个enable_shared_from_this 这个功能。查看boost源码:enable_shared_from_this 中有一个weak_ptr的成员。在构造share_ptr的构造函数中,会加载函数sp_pointer_construct ,这个函数会调用sp_enable_shared_from_this,share_ptr 中实现了两个sp...
eg:weak_ptr 监测的就是 shared_ptr 管理的资源,当共享智能指针调用 shared.reset(); 之后管理的资源被释放,因此 weak.expired() 函数的结果返回 true,表示监测的资源已经不存在了。 #include <iostream> #include <memory> using namespace std; int main() ...
shared_ptr属于RAII类,即资源内存的分配与释放封装到一个类中,该类对象构造时申请内存,析构时释放内存,从而避免由于疏忽导致的内存泄漏或者对同一块内存重复释放问题。shared_ptr属于共享指针,即多个shared_ptr对象可以指向同一块堆区内存,类内部采用引用计数原理来记录当前指向某块堆内存的shared_ptr对象个数,当引用...
有些内存资源已经被释放,但指向它的指针并没有改变指向(成为了野指针),并且后续还在使用; 有些内存资源已经被释放,后期又试图再释放一次(重复释放同一块内存会导致程序运行崩溃); 没有及时释放不再使用的内存资源,造成内存泄漏,程序占用的内存资源越来越多。
需注意,两个share_ptr对象并不能共享同一份指针资源,每份独立占用其资源,故避免了资源重复释放的潜在问题。为避免共享资源指向的互引死锁问题,C++11引入了weak_ptr。这类指针的显著特性是不增加资源的使用计数,使得共享资源的指针相互关联也不会导致资源无法正常释放。通过将资源指向转为弱引用,可避免...
使用shared_ptr时,如果不小心形成了循环引用(两个或多个shared_ptr互相引用形成闭环),即使所有指向它们的普通引用都已消失,它们的引用计数也不会降为零,从而导致资源无法释放,引发内存泄漏。 忽略裸指针转换 从原始指针到智能指针的转换需谨慎,特别是当原始指针已被其他地方管理时,直接构造智能指针可能会导致重复释放资...