它们也能相互赋值,也可以传入一个形参为std::shared_ptr<Widget>的函数。但是自定义删除器类型不同的std::unique_ptr就不行,因为std::unique_ptr把删除器视作类型的一部分。 另一个不同于std::unique_ptr的地方是,指定自定义删除器不会改变std::shared_ptr对象的大小。不管删除器是什么,一个std::shared_ptr...
Item 20: Use std::weak_ptr for std::shared_ptr-like pointers that can dangle 自相矛盾的是,如果有一个像std::shared_ptr(见Item19)的但是不参与资源所有权共享的指针是很方便的。换句话说,是一个类似std::shared_ptr但不影响对象引用计数的指针。这种类型的智能指针必须要解决一个std::shared_ptr不存...
std::weak_ptr是一个与std::shared_ptr相关的类,它不会增加所指向对象的引用计数。即使没有std::shared_ptr实例持有对象,只要存在std::weak_ptr,对象也不会因为引用计数归零而被销毁。但是,一旦所有std::shared_ptr都释放了该对象,std::weak_ptr就会变成过期状态(expired),此时尝试访问对象是不安全的。 (1)创...
原因:(1)new 出来的对象必须手动delete掉;(2)掌握delete的shared_ptr 在 new 出来的对象之中;(3)两个new 对象里的shared_ptr 互相等待。 解锁:试想如果只有单向指向,如上代码:去掉一行:b->m_a =a ;,但是将 B 引用 A 的信息保存在某处,且对于 A 和 B的shared_ptr 对象是不可见的,但是这些信息却可以...
unique_ptr: 独占指针, 相当于以前的auto_ptr, 只能移动而不可复制(复制操作默认是移动语义的), 没有其它成员变量, 可以用make_unique来初始化数组 shared_ptr: 有引用计数的指针, 因此可以复制 weak_ptr: 不参与引用计数, 与shared_ptr一起使用 14 在资源类中小心Copying行为 ...
为了确保一个对象在初始化后能够最终有效被delete,最好使用shared_ptr和auto_ptr,而前者更好,因为是基于引用计数机制,可以在复制时保持两个指针都指向同一对象,且只有两个指针都销毁时才delete,而auto_ptr只会保证一个指针有效,在复制时,原指针会指向null。 对于数组对象,两个指针不会使用对应的delete[],所以容易...
这个问题发生于“对象在动态连接程序库(DLL)中被new创建,却在另一个DLL内被delete销毁”。在许多平台上,这一类“跨DLL之new/delete成对运用”会导致运行期错误。tr1::shared_ptr没有这个问题,因为它缺省的删除器是来自“tr1::shared_ptr诞生所在的那个DLL”的delete。
我们前面介绍了unique_ptr智能指针,它对它所指向的对象资源具有专属所有权。这个就直接导致unique_ptr是无法进行复制操作的。有没有一种智能指针对象资源不具有专属所有权,也就是它可以进行复制操作。当然有的。那就是shared_ptr智能指针。shared_ptr也是对裸指针进行包装的类。
BaseClass *b = static_cast< BaseClass *>d; // 用C风格直接是 b = (BaseClass*) d 1. 2. 我们可以弄一个简易的Shared型智能指针类,如果直接像下面这样写: template <class T> class SharedPtr { private: T* Ptr; static size_t Count; ...
return std::tr1::shared_ptr<Person>(new RealPerson(name, birthday, addr)); } 编译依赖性最小化的本质: 如果使用object reference或object pointers可以完成任务,就不要使用objects。 如果能够,尽量以class声明式替换class定义式。 为声明式和定义式提供不同的头文件。