gpt4 book ai didi

c++ - 为什么即使还有弱指针,make_shared 也会调用析构函数?

转载 作者:行者123 更新时间:2023-12-05 08:21:32 27 4
gpt4 key购买 nike

从理论上讲,make_shared()shared_ptr 之间的一个区别是内存分配技术。 make_shared() 应该使用一个 block ,而 shared_ptr 应该使用两个 block 。

make_shared() 的一个缺点应该是即使只有一个 weak_ptr 还活着,内存也无法释放。

有人可以解释为什么这个程序的输出总是独立于我用来创建 shared_ptr 的函数吗?

#include <iostream>
#include <memory>

class mc
{
public:
mc(int p):p_{p} {std::cerr<<"Constructor"<<std::endl;}
~mc() { std::cerr<<"Destructor"<<std::endl;}
private:
int p_;
};

std::weak_ptr<mc> wp3;

int main()
{

auto sp=std::make_shared<mc>(4);
auto sp2=sp;
auto sp3{sp};
wp3=std::weak_ptr<mc>{sp};

sp2.reset();
sp3.reset();
sp.reset();

for (int i =0;i< 5;i++) {std::cerr<<sp.use_count()<<std::endl;}

return 0;
}

我原以为最后会调用析构函数方法,因为 weak_ptr 仍然存在,为什么没有发生?

最佳答案

即使无法释放其内存,当(非弱)引用计数达到零时,shared_ptr 持有的对象仍将被销毁。对象销毁和内存释放是两个独立的操作,不需要同时发生。

一般来说,由于 make_shared 的“一次分配”行为是一种优化,它不应该对您的代码产生明显的影响。

关于c++ - 为什么即使还有弱指针,make_shared 也会调用析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75250585/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com