shared_ptr的使用和陷阱】的更多相关文章

shared_ptr的使用和陷阱 shared_ptr的使用 分配内存 make_shared //make_shared<int>分配一块int类型大小的内存,并值初始化为100 //返回值是shared_ptr类型,因此可以直接赋值给sp shared_ptr<int> sp = make_shared<int>(100); new 接受指针参数的只能指针构造函数是explicit的,因此,我们不能将一个内置指针隐式转化为一个只能指针,必须使用直接初始化形式 //错…
一.智能指针起因 在C++中,动态内存的管理是由程序员自己申请和释放的,用一对运算符完成:new和delete. new:在动态内存中为对象分配一块空间并返回一个指向该对象的指针: delete:指向一个动态独享的指针,销毁对象,并释放与之关联的内存. 使用堆内存是非常频繁的操作,容易造成堆内存泄露.二次释放等问题,为了更加容易和更加安全的使用动态内存,C++11中引入了智能指针的概念,方便管理堆内存,使得自动.异常安全的对象生存期管理可行.智能指针主要思想是RAII思想,“使用对象管理资源”,…
一.智能指针起因 在C++中,动态内存的管理是由程序员自己申请和释放的,用一对运算符完成:new和delete. new:在动态内存中为对象分配一块空间并返回一个指向该对象的指针: delete:指向一个动态独享的指针,销毁对象,并释放与之关联的内存. 使用堆内存是非常频繁的操作,容易造成堆内存泄露.二次释放等问题,为了更加容易和更加安全的使用动态内存,C++11中引入了智能指针的概念,方便管理堆内存,使得自动.异常安全的对象生存期管理可行.智能指针主要思想是RAII思想,"使用对象管理资源&q…
条款1:不要把一个原生指针给多个shared_ptr管理 int* ptr = new int; shared_ptr<int> p1(ptr); shared_ptr<int> p2(ptr); //logic error ptr对象被删除了2次 这种问题比喻成“二龙治水”,在原生指针中也同样可能发生.   条款2:不要把this指针给shared_ptr class Test{ public:     void Do(){  m_sp =  shared_ptr<Test…
为了解决C++内存泄漏的问题,C++11引入了智能指针(Smart Pointer). 智能指针的原理是,接受一个申请好的内存地址,构造一个保存在栈上的智能指针对象,当程序退出栈的作用域范围后,由于栈上的变量自动被销毁,智能指针内部保存的内存也就被释放掉了(除非将智能指针保存起来). C++11提供了三种智能指针:std::shared_ptr, std::unique_ptr, std::weak_ptr,使用时需添加头文件<memory>. shared_ptr使用引用计数,每一个shar…
条款1:不要把一个原生指针给多个shared_ptr管理 int* ptr = new int; shared_ptr<int> p1(ptr); shared_ptr<int> p2(ptr); //logic error ptr对象被删除了2次 这种问题比喻成“二龙治水”,在原生指针中也同样可能发生.   条款2:不要把this指针给shared_ptr class Test{ public: void Do(){ m_member_sp = shared_ptr<Tes…
boost库中的智能指针shared_ptr, 功能强大, 且开销小,故受到广大coder的欢迎. 但在实际的使用过程中,笔者也发现了一些不足. 1.定制的删除器 shared_ptr除了可以使用默认的delete删除器来删除资源, 也可以定制删除器来删除资源, 但是删除的时候没有办法返回值, 这应该可以算是一个缺陷. 如对于文件句柄的操作 bool CFileIO::Open(LPCTSTR fileName, LPCTSTR mode){    m_pFile.reset(_tfopen(f…
shared_ptr和new结合使用 一个shared_ptr默认初始化为一个空指针.我们也可以使用new返回的指针来初始化一个shared_ptr: shared_ptr<double> p1; shared_ptr<int> p2(new int(42)); // p2指向一个值为42的int 接受指针参数的智能指针构造函数是explicit的,因此,我们不能将一个内置指针隐式的转换为一个智能指针,必须使用直接初始化形式: shared_ptr<int> p1 =…
智能指针 shared_ptr 和 new结合使用 用make_shared函数初始化shared_ptr是最推荐的,但有的时候还是需要用new关键字来初始化shared_ptr. 一,先来个表格,唠唠new和shared_ptr 操作 功能描述 shared_ptr<T> p(q) 智能指针p管理内置指针q所指向的对象:q必须指向new分配的内存,且能够转换为T*. shared_ptr<T> p(u) p从unique_ptr u那里接管了原来u所指向对象的所有权,并将u置为空…
文档: http://www.boost.org/doc/libs/1_57_0/libs/smart_ptr/shared_ptr.htm shared_ptr构造有个原型 template<class Y, class D> shared_ptr(Y * p, D d);d是deleter.如shared_ptr<FILE> ctx(fp,::flose); Introduction The shared_ptr class template stores a pointer…