};template<typenameT>classShared_ptr{public:constexprShared_ptr()noexcept=default;constexprShared_ptr(nullptr_t)noexcept: Shared_ptr() {}explicitShared_ptr(T *ptr): ptr_{ptr} {if(ptr_ !=nullptr) { rep_ =newref_
值得一提的是,和 unique_ptr、weak_ptr 不同之处在于,多个 shared_ptr 智能指针可以共同使用同一块堆内存。并且,由于该类型智能指针在实现上采用的是引用计数机制,即便有一个 shared_ptr 指针放弃了堆内存的“使用权”(引用计数减 1),也不会影响其他指向同一堆内存的 shared_ptr 指针(只有引用计数为 0 时,堆...
1.1 shared_ptr 参考:https://zh.cppreference.com/w/cpp/memory/shared_ptr std::shared_ptr是通过指针保持对象共享所有权的智能指针。多个shared_ptr对象可占有同一对象。下列情况之一出现时销毁对象并解分配其内存: 最后剩下的占有对象的shared_ptr被销毁; 最后剩下的占有对象的shared_ptr被通过operator=或reset(...
// 指向一个值为42的int的shared_ptr shared_ptr<int> p3 = make_shared<int>(42); // p4指向一个值为“9999999999”的string shared_ptr<string> p4 = make_shared<string>(10, '9'); // p5指向一个值初始化的int,即,值为0 shared_ptr<int> p5 = make_shared<int>(); 1. 2. 3. 4. 5...
shared_ptr使用一个引用计数器,类似java中对象垃圾的定位方法,如果有一个指针引用某块内存,则引用计数+1,释放计数-1.如果引用计数为0,则说明这块内存可以释放了。 模型如下: 引用计数让我们的可以有多个指针拥有使用权,但是这种方式还是会有风险的,假如一个指针对指向的内存区域进行了更改,则其他指针希望是原来的值...
3、替代NULL的nullptr4、三种智能指针帮助内存管理(说一下名称):unique_ptr、shared_ptr 和weak_ptr。5、C++11 引入了基于范围的迭代写法,比如基于范围的for循环,用一个冒号就可实现遍历,我们拥有了能够写出像 Python一样简洁的循环语句。 393.接口和抽象类的区别 接口中所有的方法隐含的都是抽象的。而抽象类则...
template<class T> // 辅助型智能指针,配合解决shared_ptr循环引用问题 class weak_ptr // 没有RAII,不管理资源 { public: weak_ptr() :_ptr(nullptr) {} weak_ptr(const shared_ptr<T>& sp) :_ptr(sp.get()) {} weak_ptr(const weak_ptr<T>& wp) :_ptr(wp._ptr) {} weak_ptr<T>& oper...
shared_ptr允许多个指针指向同一个变量。 unique_ptr则独占所指向的变量。 weak_ptr则指向shared_ptr所管理的变量。 2.智能指针的基础用法 1.智能指针的初始化 智能指针是基于类模板生成的,因此,要初始化一个智能指针,就必须声明指针所指向的数据类型,不然智能指针里面包含的原始指针是个空指针。
可以重载默认删除器,但是因为会影响到unique_ptr类型的构造及reset,所以必须在尖括号中提供删除器类型。 weak_ptr 指向shared_ptr对象的弱引用,不会改变引用计数 因为对象可能不存在,wp不能直接访问对象,必须先调用lock。 另外也要检查指向的对象是否非空。
C++中的nullptr相比C语言中的NULL具有更好的类型安全性。nullptr是一个强类型的指针空值,而NULL在C中通常被定义为0或(void*)0,这可能导致隐式类型转换的问题。使用nullptr可以避免这类问题,并且使代码更加清晰和易于理解。 关于本问题的更多回答可点击原文查看: ...