**
C++智能指针
**
1.auto_ptr :
auto_ptr指向某个对象时,会获得这个对象的所有权,而当其删除以后,其管理的对象也会被delete;
当有另外一个auto_ptr指向该对象时,会获得这个对象的所有权,并且剥夺前一个 auto_ptr 的控制权,使其置为nullptr;
这种智能指针并不好使用,已在C++ 11中被弃用;
int *p = new int(36);
cout << "*p : " << *p << endl;
auto_ptr<int> ptr(p);
cout << "*ptr : " << *ptr << endl;
auto_ptr<int> ptr_2;
ptr_2 = ptr;
cout << "*ptr_2 : " << *ptr_2 << endl;
//cout << "ptr : " << *ptr << endl;
if(*ptr) {
cout << "ptr is not deleted." << endl;
}else
{
cout << "ptr is deleted." << endl;
}
运行结果:
2.unique_ptr:
unique_ptr 不支持复制与赋值操作, 但是可以转移所有权(通过使用std:move() 实现);
unique_ptr<int> pt = make_unique<int>(100);
cout << "pt : " << *pt << endl;
// unique_ptr<int> pt1 = pt; ERROR : pt ---> move-only
unique_ptr<int> pt1 = move(pt);
cout << "pt1 : " << *pt1 << endl;
if(pt.get()) {
cout << "pt has the op." << endl;
}
if(pt1.get()) {
cout << "pt1 has the op." << endl;
}
其中std::get()操作可以获得该指针;
unique_ptr 通过 std::move() 操作,转移原先指针的控制权,并将其链接到新的指针上;
3.shared_ptr;
shared_ptr 通过计数来共享对象,当引用计数为0时,对象没有被使用。可以进行析构;
循环引用,会导致内存泄漏问题;
4.weak_ptr :
weak_ptr 对 shared_ptr 形成观察者模式