智能指针的提出:每次new出来的内存都要手动delete释放。智能指针的本质含义就是为了自动管理资源的释放,防止由于疏忽或者程序逻辑错误导致的资源泄漏问题。智能指针是一个类,这个类的构造函数中传入一个普通指针,析构函数中释放传入放入指针。
1.Auto_ptr
-
不支持复制(拷贝构造函数)和赋值(operator=),但是赋值或复制时出错但不会提示。拷贝构造没有实现,系统提供的是浅拷贝,两个指针指向同一个堆内存,最后sp1变成野指针(
改变资源的所有权
),程序崩溃。 - 支持拷贝构造和赋值,所有权会转移。
-
不可以作为容器元素
。容器要求所保存的类型定义复制和赋值操作符,使得它们表现的类似内置类型,在赋值或者复制之后,两个对象必须具有相同值,auto_ptr不满足。 - 栈上的指针管理堆上的内容。
2.Unique_ptr
-
std库中的。和auto_ptr很像,不支持复制和赋值,但比auto_ptr好,是无法复制和赋值,
直接赋值或者直接复制出错会提示
。 - 可以作为函数返回值,相当于间接赋值,要用std::move,如std::unique_ptr p2 = std::move(p1);。
-
不可以直接,
可以间接做为容器元素
(使用move)。
3.Scoped_ptr
- Boost库中的,用法和auto_ptr几乎一样,也可替换,可以从一个auto_ptr
版权声明:本文为wAmber原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。