1) C++11标准更好地管理和使用动态内存,防止内存泄漏和悬垂指针,定义了两个智能指针类型,分别是shared_ptr和unique_ptr。shared_ptr可以让多个智能指针指向同一个对象,而unique_ptr只容许一个指针独自指向一个对象。
Shared_ptr是用于管理动态内存的指针,它拥有垃圾回收机制。可与其他对象共享管理,这种指针具有取得指针所有权并共享该所有权的能力。当最后一个指针释放所有权时,也就是引用计数为0时,指针的所有者将删除该指针。Shared_ptr自身如果被销毁,或者通过赋值或者通过调用reset函数,他们的值被改变的话,它就释放对共享对象的所有权。
Unique_ptr拥有它所指向的对象,它与shared_ptr不同点是,在任一时刻,只能有一个unique_ptr指向一个对象。如果这个unique_ptr被销毁,则它所指向的对象也要被销毁。
#include <memory>
#include <iostream>
using namespace std;
int main()
{
shared_ptr<int> ptr = make_shared<int>(100);
std::shared_ptr<int>ptr2(new int(10));
unique_ptr<int>ptr4(new int(20));
unique_ptr<int>ptr3(ptr4.release());
unique_ptr<int>ptr5;
ptr5.reset(ptr3.release());
cout << "*ptr: " << *ptr << endl;
cout << "*ptr:2 " << *ptr2 << endl;
cout << "*ptr5: " << *ptr5 << endl;
return 0;
}
2)
shared_ptr
可以说近乎完美,但是通过引用计数实现的它,虽然解决了指针独占的问题,但也引来了引用成环的问题,这种问题靠它自己是没办法解决的,所以在C++11的时候将shared_ptr
和weak_ptr
一起引入了标准库,用来解决循环引用的问题。
weak_ptr的原理
weak_ptr是为了配合shared_ptr而引入的一种智能指针,它指向一个由shared_ptr管理的对象而不影响所指对象的生命周期,也就是,将一个weak_ptr绑定到一个shared_ptr不会改变shared_ptr的引用计数。不论是否有weak_ptr指向,一旦最后一个指向对象的shared_ptr被销毁,对象就会被释放。从这个角度看,weak_ptr更像是shared_ptr的一个助手而不是智能指针。
【C++】weak_ptr弱引用智能指针详解_Yngz_Miao的博客-CSDN博客