标签:unique_ptr shared_ptr weak_ptr enable_shared_from_t 智能指针
C++ 智能指针
flyfish 2015-3-1
使用原始指针进行显示内存管理在性能上有优势,但容易出错。诸如 野指针,重复释放,内容泄露等。
C++为了在编程语言上支持更好的内存管理机制,C++98提供了auto_ptr,因为auto_ptr的缺点在C++11中被废弃,C++11提供了
unique_ptr,shared_ptr,weak_ptr等智能指针在自动回收堆分配的内存,智能指针的设计原则是在内存和性能上尽可能高效。
头文件是#include<memory> , 命名空间是std 。
unique_ptr
关键字 只可移动,不可复制
unique 唯一的,独一无二的。unique_ptr 只可移动,不可复制。不能与其他 unique_ptr 类型的指针对象共享所指对象的内存,只允许一个所有者。unique_ptr 不共享它的指针。 它无法复制到其他 unique_ptr,无法通过值传递到函数。只能移动 unique_ptr,内存资源所有权将由一个unique_ptr转移到另一 unique_ptr,并且原来的unique_ptr 不再拥有此资源。
在简单的情况下可以使用unique_ptr替代以前使用auto_ptr的老代码。
unique_ptr 中的唯一数据成员是封装的指针。 unique_ptr 与该指针的大小完全相同,不是四个字节就是八个字节。 使用重载了 * 和 -> 运算符的智能
指针访问封装指针的速度不会明显慢于直接访问原始指针的速度。
使用方法
unique_ptr<ClassName> p1(new ClassName());
auto p1= make_unique<ClassName>();
unique_ptr<ClassName> p2= std::move(p1);//move将所有权转移到p2 并重置p1。
shared_ptr
关键字 共同拥有
share 分享,分担;分配 。
shared_ptr 允许多个该智能指针共同拥有同一个堆内存分配的对象。采用引用计数的智能指针。 如果你想要将一个原始指针分配给多个所有者,就可以使用该指针。 当所有 shared_ptr 所有者超出了范围或放弃所有权,才会删除原始指针。 大小为两个指针;一个用于对象,另一个用于包含引用计数的共享控制块。每当shared_ptr 新增 ,超出作用域,复位时 引用计数就会递增或者递减。 当引用计数到达零时,控制块就会删除内存资源和自身。
使用方法
shared_ptr<ClassName> p1(new ClassName());
auto p1 = make_shared<ClassName>();
shared_ptr<Song> p2(nullptr);
p2= make_shared<ClassName>();
weak_ptr
关键字 可访问shared_ptr指向的对象,但不参与引用计数
weak疲软的;虚弱的;无力的;不牢固的.
weak_ptr用来在不参与引用计数增加的情况下访问 shared_ptr 的基础对象.
使用 weak_ptr 成员 lock,则可返回其指向内存的一个 shared_ptr 对象,且在所指对象内存已经无效时,返回指针空值(nullptr)。可以用来验证shared_ptr智能指针的有效性。
使用方法
shared_ptr<ClassName> p1(new ClassName());
weak_ptr<ClassName> wp= p1; //指向shared_ptr<ClassName>所指对象
shared_ptr<ClassName> p3 =wp.lock(); //转换为shared_ptr<ClassName>
if (p3 != nullptr) { }
enable_shared_from_this和它的成员函数shared_from_this
enable_shared_from_this是Boost库中的一个类,在使用Boost asio 编写网络程序可以让缓冲区staying alive
不要在构造函数中使用 shared_from_this
当编写一个类时可以使用 shared_from_this 函数来获得指向自身的 shared_ptr。
使用方法
class ClassName: public boost::enable_shared_from_this<ClassName>
{
}
创建类的对象时必须使用智能指针
shared_ptr<ClassName> p(newClassName());
关键字
shared_from_this不能在构造函数中使用
创建继承于:enable_shared_from_this类的对象时必须使用智能指针
否则 tr1::bad_weak_ptrbad_weak_ptr异常
C++ 智能指针
标签:unique_ptr shared_ptr weak_ptr enable_shared_from_t 智能指针
原文地址:http://blog.csdn.net/flyfish1986/article/details/44003325