从理论上讲,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
的“一次分配”行为是一种优化,它不应该对您的代码产生明显的影响。
https://stackoverflow.com/questions/75250585/