智能指针的提出:智能指针是存储指向动态分配对象指针的类,用于生存期控制。能够确保正确销毁动态分配的内存,防止内存泄露。
1.智能指针的分类:
不带引用计数的智能指针
auto_ptr unique_ptr scoped_ptr
带引用计数的智能指针
shared_ptr:强智能指针
weak_ptr:若智能指针
2.不带引用计数的智能指针是如何确保正确释放堆上内存的?
auto_ptr:
auto_ptr<A> ptr1(new A(10));
auto_ptr<A> ptr2 = ptr1;
当这两行代码执行完后,ptr1已经不再指向A这个对象,并且ptr1=NULL,ptr1对A对象的所有权已经转移给了ptr2,也就不能通过ptr1调用该类的方法。
vector<auto_ptr<int>> vec;
不能将auto_ptr类型的指针作为STL容器的元素。因为容器避免不了直接拷贝构造和互相赋值。auto_ptr的这种特性会给STL容器的使用造成很大的麻烦。
unique_ptr:
unique_ptr<A> ptr1(new A(10));
unique_ptr<A> ptr2 = ptr1;//error
unique_ptr<A> ptr3 = func();//ok
unique_ptr不支持拷贝构造函数和赋值运算符重载函数,不能隐式的将原指针置为NULL,但是可以通过返回值赋值。unique_ptr支持移动构造函数和移动赋值运算符重载函数,是通过move(C+&