C++中有三种智能指针:std::unique_ptr、std::shared_ptr、std::wake_ptr,都在<memory>头文件定义中。
出现智能指针的缘由:C++内没有内存回收机制,程序员分配和释放经常会出错。
1.unique_ptr
在unique_ptr之前,C++98引入了auto_ptr,但在C++11标准中auto_ptr被标为遗弃;主要原因有:
(1)auto_ptr不安全;
(2)auto_ptr不能用在STL容器中。
《C++Primer》中指出auto_ptr的缺陷:
在vs中对于智能指针赋值的操作:
可以看出,unique_ptr直接报错,也就是说编译不能通过,而auto_ptr并没有报错,依然可以编译通过。
再看auto_ptr赋值操作对象所有权的交换:
可以看出,赋值操作后,右操作数已经交出对象的所有权,下面再操作右边的指针就会使程序崩溃!
如下:
所以,《C++高级编程》中指出:
vs编译器支持C++标准设置:
【参考】
2.《C++Primer》
3.《C++高级编程》