The object is destroyed and its memory deallocated when either of the following happens: 1.the last remaining shared_ptr owning the object is destroyed; 2.the last remaining shared_ptr owning the object is assigned another pointer via operator= or reset(). https://en.cppreference.com/w/cpp/...
} 这是reset()的实现, 用shared_ptr()调用构造一个临时指针, 并将其与调用reset()的指针对象(上例中的ptr)进行交换, 原对象指向的资源变为nullptr, 引用计数变为0. 临时对象指向原指针指向的资源(上例中的100), 引用计数变为3(临时对象, second, third), 语句结束, 临时对象析构, 引用计数减一. 总结 ...
p.reset();```▲ 循环引用问题与解决方案 当两个对象相互持有对方的指针时,可能会形成循环引用,从而导致内存泄漏。为了解决这个问题,我们可以使用 weak_ptr 来代替 shared_ptr。weak_ptr是一种弱引用,它不会增加对象的引用计数,并且在对象释放时会自动设置为nullptr。此外,提供一个自定义的析构函数,也可以...
use_count:返回当前被所有 shared_ptr 指向的对象的引用计数。 reset:重置 weak_ptr。
shared_ptr 被重置(reset 方法)为不指向任何对象。 shared_ptr 是通过空指针或 nullptr 构造的。 2. 编写代码检查 shared_ptr 是否为空 可以通过以下几种方式检查 shared_ptr 是否为空: 使用if 语句直接判断 cpp #include <iostream> #include <memory> int main() { std::shared_ptr<in...
对sPtr4使用了reset()后,释放被管理对象的所有权,被管理对象的shared_ptr个数减 1,sPtr4被设置为nullptr,同时,sPtr1-3的引用计数均变为 3。 对sPtr3使用了reset(new int(100))后,释放原被管理对象的所有权,被管理对象的shared_ptr个数减 1,sPtr4被设置为新的管理对象int(100),同时,sPtr1-3的引用计...
复制auto_ptr对象时,把指针指传给复制出来的对象,原有对象的指针成员随后重置为nullptr。 这说明auto_ptr是独占性的,不允许多个auto_ptr指向同一个资源。 voidrunGame(){std::auto_ptr<Monster>monster1(newMonster());//monster1 指向 一个怪物monster1->doSomething();//怪物做某种事std::auto_ptr<Monster...
ptr.reset(); if (ptr == nullptr) { std::cout << "ptr为空指针" << std::endl; } return 0; } ``` 在上述代码中,我们首先创建了一个shared_ptr对象ptr,并通过new关键字为其分配了一个int类型的动态对象。然后,我们通过reset()函数将ptr置为空指针,并在if语句中判断ptr是否为空指针。由于reset(...
std::shared_ptr<int> p2 (nullptr); std::shared_ptr<int> p3 (new int); std::shared_ptr<int> p4 (new int, std::default_delete<int>()); std::shared_ptr<int> p5 (new int, [](int* p){delete p;}, std::allocator<int>()); ...
p1.reset(new int(34)); 1. 在这种情况下,它将在内部指向新指针,因此其引用计数将再次变为1。 使用nullptr重置: p1 = nullptr; 1. shared_ptr是一个伪指针 shared_ptr充当普通指针,我们可以将*和->与 shared_ptr 对象一起使用,也可以像其他 shared_ptr 对象一样进行比较; ...