请问下Shared_ptr reset()是否一定会调用到析构
请教下Shared_ptr reset()是否一定会调用到析构
shared_ptr<A> p(new A);
p.reset();
reset()貌似是生成一个临时匿名的shared_ptr来交换指针所有权,调用之后应该会执行A的析构,写了个demo确实是这样,但在项目中有时候又不会执行到析构,reset后shared_ptr确实是个空对象,请大神指点下。
------解决思路----------------------
shared_ptr 应该是一个基于 引用计数 的智能指针, reset 或 p 析构的时候,只是把对于的引用计数减一,如果减一后引用计数为 0 才执行 A 的析构和删除其内存的操作。
你的 demo 中只有一个引用,那么这个指针 reset 的时候就会析构 A。 项目中的时候可能这个指针还有其它引用,所以某个 reset 的时候就没有执行 A 的析构。
------解决思路----------------------
------解决思路----------------------
如果 p 是最后一个管理 new A 对象的智能指针,就会析构,否则不会。
------解决思路----------------------
嗯,reset将引用计数减1,如果引用计数为零了,那么调用shared_ptr持有对象的析构
shared_ptr<A> p(new A);
p.reset();
reset()貌似是生成一个临时匿名的shared_ptr来交换指针所有权,调用之后应该会执行A的析构,写了个demo确实是这样,但在项目中有时候又不会执行到析构,reset后shared_ptr确实是个空对象,请大神指点下。
------解决思路----------------------
shared_ptr 应该是一个基于 引用计数 的智能指针, reset 或 p 析构的时候,只是把对于的引用计数减一,如果减一后引用计数为 0 才执行 A 的析构和删除其内存的操作。
你的 demo 中只有一个引用,那么这个指针 reset 的时候就会析构 A。 项目中的时候可能这个指针还有其它引用,所以某个 reset 的时候就没有执行 A 的析构。
------解决思路----------------------
#include <cstdio>
#include <memory>
struct A {
A() { std::printf("[%s] called\r\n", __FUNCTION__); }
~A() { std::printf("[%s] called\r\n", __FUNCTION__); }
int a = 0;
};
int main() {
{
auto ptr_a = std::make_shared<A>();
auto ptr_b = ptr_a;
std::printf("before reset\r\n");
ptr_a.reset();
std::printf("after reset\r\n");
}
std::printf("wait std::getchar()\r\n");
std::getchar();
return 0;
}
------解决思路----------------------
如果 p 是最后一个管理 new A 对象的智能指针,就会析构,否则不会。
------解决思路----------------------
嗯,reset将引用计数减1,如果引用计数为零了,那么调用shared_ptr持有对象的析构