c++ 指针
原指针:
相当于C中的指针。
智能指针:
#include <memory>
不必使用 delete 运算符释放内存,只要不在需要智能指针,它们就会自动释放
int i = 10;
std::unique_ptr<int> pdata{&i}; //error
std::cout << *pdata << std::endl;
智能指针在结束时候会自动将指着指向的内存释放掉,所以,智能指针只能指向动态分配的内存地址
unique_ptr<T>
std::unique_ptr<int> pdata = new int{10}; //error
std::unique_ptr<int> pdata{new int{10}}; //correct
std::unique_ptr<int> pdata2;
pdata2 = pdata; //error
shared_ptr<T>
#if 0 //共享指针定义 1
std::shared_ptr<int> pdata{new int{10}};
#else //共享指针定义 2
auto pdata = std::make_shared<int>(10);
#endif std::shared_ptr<int> pdata2 = pdata;

如上图所示,如果智能指针指向的对象中包含shared智能指针成员,并且该智能指针指向如上图所示:
D中有成员指向A
A中有成员指向B
B中有成员指向C
C中有成员指向D
当pA, pB, pC, pD 全部释放之后,由于此时还有shared指针指向该内存空间,所以此时表示对象A,B,C,D的内存空间都
不会被释放,就会造成内存泄露。
因为上图所示的问题,所以引入了下边的 weak_ptr 弱指针。
weak_ptr<T>
总是从 shared_prt<T> 中创建
std::shared_ptr<int> pdata{new int{10}};
std::weak_ptr<int> pdata2{pdata};
if (pdata2.expired()) {
std::cout << "no exists..." << std::endl;
} else {
std::cout << "exists..." << std::endl;
}
浙公网安备 33010602011771号