weak_ptr是shared_ptr的帮手,用来共享对象但不拥有对象。使用use_count()返回的是对象被shared_ptr拥有的次数,至于weak_ptr对它的共享次数是不计的。而且weak_ptr可以为空。 一般而言,shared_ptr并非线程安全的。因此为避免data race造成的不明确行为,当你在多个线程中以shared_pointer指向同一个对象,你必须使用诸如...
std::weak_ptr 通常用于观察 std::shared_ptr。如果 std::weak_ptr 所指向的对象还存在的话,可以通...
shared_ptr<int> ptr3(ptr1); // 允许拷贝 shared_ptr 是线程安全的。 同一个 shared_ptr 被多个线程读是安全的,被多个线程写是不安全的,共享引用计数的不同的 shared 被多个线程写是安全的。 虽然shared_ptr 更为智能,但是维护引用计数的存储和运算都是需要成本的,虽然因为 shared ptr 内部有比较好的优化...
unique_ptr:独占对象的所有权,由于没有引用计数,性能较好于shared_ptr。 weak_ptr:该智能指针通常用来配合shared_ptr,解决循环引用的问题。 shared_ptr 内存模型图 shared_ptr是一个模板类。 shared_ptr内部有两个指针,一个ptr指向对象,一个ptr指向控制块。控制块里面包含着引用计数(reference count,或者叫use_count...
shared_ptr shared_ptr 多个指针指向相同的对象; 使用引用计数,引用计数是线程安全的,但是对象的读写需要加锁。 不可以直接将指针直接赋值给一个智能指针,因为指针指针是一个类。 get获取原始指针 最大的陷阱就是循环引用,这会导致内存无法正确释放,导致内存泄漏 ...
另外weak_ptr和shared_ptr紧密相关,用户可以从weak_ptr构造出shared_ptr,也可以从shared_ptr构造weak_ptr,但是weak_ptr不涉及到对象的生命周期。由于shared_ptr的线程安全性是和weak_ptr耦合在一起的,本文的分析也涉及到weak_ptr。 下面先从总体上看一下shared_ptr和weak_ptr的实现。
3.shared_ptr 4.weak_ptr 5.scoped_array/shared_array 6.PIMPL技法 1.boost智能指针 智能指针是利用RAII(Resource Acquisition Is Initialization:资源获取即初始化)来管理资源 在构造函数中对资源初始化,在析构函数中对资源释放 ...
为了解决循环引用问题,可以使用 std::weak_ptr。std::weak_ptr 是一种弱引用,它可以指向 std::shared_ptr 持有的对象,但不会增加对象的引用计数。这样,即使存在循环引用,通过使用 std::weak_ptr 可以打破循环引用,使对象的引用计数能够正确降为零,从而触发析构函数的调用。
共享使用指针时,shared_ptr 是首选。它提供与原始指针几乎相同的用法,但通过引用计数实现资源安全共享。虽然shared_ptr维护成本和复杂性略高,但其安全性、线程友好特性使其成为共享资源管理的优质选项。unique_ptr的赋值机制允许在特定情况下安全地重用指针,通过std::move()函数实现所有权转移。它不能像...
在实际编程中,std::shared_ptr 和 std::weak_ptr 常常协同工作,无论是在构建复杂数据结构,如树、图等,还是在实现设计模式,如观察者模式等方面,它们都能提供简洁、高效且安全的解决方案。正确理解和运用这两种智能指针的协同工作机制,有助于 C++ 程序员编写更健壮、更可靠的代码,减少因内存管理不当而引发的错误...