std::weak_ptr是一个与std::shared_ptr相关的类,它不会增加所指向对象的引用计数。即使没有std::shared_ptr实例持有对象,只要存在std::weak_ptr,对象也不会因为引用计数归零而被销毁。但是,一旦所有std::shared_ptr都释放了该对象,std::weak_ptr就会变成过期状态(expired),此时尝试访问对象是不安全的。 (1)创...
unique_ptr: 独占指针, 相当于以前的auto_ptr, 只能移动而不可复制(复制操作默认是移动语义的), 没有其它成员变量, 可以用make_unique来初始化数组 shared_ptr: 有引用计数的指针, 因此可以复制 weak_ptr: 不参与引用计数, 与shared_ptr一起使用 14 在资源类中小心Copying行为 这一条是当你不得不自己建立资源...
一般来说,可以用vector和string作为数据的替换对象,如果一定要用数组,则可以用boost::scoped_array和boost::shared_array。 另外,auto_ptr和shared_ptr只是两种常见的实现方式,用对象管理资源的思想和这两个对象本身无关。当你需要一些自定义的管理方式时,也可以自己实现一个数据管理类。 Item 14: Think carefully ...
原因:(1)new 出来的对象必须手动delete掉;(2)掌握delete的shared_ptr 在 new 出来的对象之中;(3)两个new 对象里的shared_ptr 互相等待。 解锁:试想如果只有单向指向,如上代码:去掉一行:b->m_a =a ;,但是将 B 引用 A 的信息保存在某处,且对于 A 和 B的shared_ptr 对象是不可见的,但是这些信息却可以...
2. 就像(几乎)所以智能指针一样,tr1::shared_ptr和auto_ptr也重载了指针取值操作符(operator-> 和 operator*),他们允许隐式转换至底部原始指针。 如: classInvestment {public:boolisTaxFree()const; ... }; Investment* createInvestment ();//factory函数std::tr1::shared_ptr<Investment> pi1(createInvestm...
tr1::shared_ptr支持定制型删除器,这也可防范“Cross-DLL problem”,可被用来自动解除互斥锁等 19. Treat class design as type design 在你想设计一个优秀的class之前,你必须首先思考和回答以下问题 新type的对象应该如何被创建和销毁? 这将影响对象的构造函数、析构函数、内存分配函数、内存释放函数 对象的初始...
这篇文章本是作为:C++ 智能指针类的第二部分,但无奈那篇篇幅已经不能再长了,于是只好将其单独写成一篇,且把 shared_ptr 的循环引用放在这里写,这样稍微比较连贯一些。 一、shared_ptr 的循环引用 定义:所谓循环引用,可类比于这样的一棵树,它含有父亲结点指向孩子结点的指针,也有孩子结点指向父亲结点的指针,即父亲...
我们前面介绍了unique_ptr智能指针,它对它所指向的对象资源具有专属所有权。这个就直接导致unique_ptr是无法进行复制操作的。有没有一种智能指针对象资源不具有专属所有权,也就是它可以进行复制操作。当然有的。那就是shared_ptr智能指针。shared_ptr也是对裸指针进行包装的类。
voidf(){std::auto_ptr<Investment>pInv(createInvestment());...} 但是在c++11之后,就已经弃用auto_ptr了,可以把auto_ptr改成shared_ptr 2.为防止资源泄露,请使用RAII(资源获取时机便是初始化时机)对象,他们在构造函数中获得资源并在析构函数中释放资源。 3.两个常被使用的RAII classes分别是shared_ptr和aut...
1. “促进正确使用”的方法包括接口的一致性,以及与内置类型的行为兼容。 2. “阻止误用”的方法包括建立新类型、限制类型上的操作,束缚对象值,以及消除客户的资源管理责任。 3. 使用shared_ptr支持定制型删除器;也可以用来自动解除互斥锁。 (查看原文) ...