码迷,mamicode.com
首页 > 编程语言 > 详细

C++ 智能指针

时间:2015-03-01 17:09:47      阅读:253      评论:0      收藏:0      [点我收藏+]

标签: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!