C++ 为什么析构函数不是';你没有被调用吗? #包括 #包括 结构Foo{ Foo(){std::cout
奇怪的是,您动态地分配了C++ 为什么析构函数不是';你没有被调用吗? #包括 #包括 结构Foo{ Foo(){std::cout,c++,c++11,destructor,shared-ptr,weak-ptr,C++,C++11,Destructor,Shared Ptr,Weak Ptr,奇怪的是,您动态地分配了共享的ptr,并且从未做过任何事情来破坏它。如果共享的ptr没有被破坏,它所指向的东西也不会被破坏 现在真的不清楚你想在这里做什么。你在写奇怪、笨拙的代码,没有用例,并且想知道如何“让它工作”。要“让它工作”,写不奇怪、不笨拙的代码。根据定义,这就是解决方案 “但事实并非如此。有人能解释为什么吗?” 您失去了对使用(sub)表达式创建的指针的引用 #include <memory> #include <iostream> struct Foo
共享的ptr
,并且从未做过任何事情来破坏它。如果共享的ptr
没有被破坏,它所指向的东西也不会被破坏
现在真的不清楚你想在这里做什么。你在写奇怪、笨拙的代码,没有用例,并且想知道如何“让它工作”。要“让它工作”,写不奇怪、不笨拙的代码。根据定义,这就是解决方案
“但事实并非如此。有人能解释为什么吗?”
您失去了对使用(sub)表达式创建的指针的引用
#include <memory>
#include <iostream>
struct Foo {
Foo() { std::cout << "Constructor ...\n"; }
void doSth() {std::cout << "hi" << std::endl;}
~Foo() { std::cout << "Destructor ...\n"; }
};
int main() {
{std::weak_ptr<Foo> jack = (*(new std::shared_ptr<Foo>(new Foo)));
std::cout << (jack).use_count() << std::endl;
// std::shared_ptr<Foo> ptr = jack.lock();
// std::cout << ptr.use_count() << std::endl;
}
}
new std::shared_ptr(new Foo))
并且永远不要在上面调用delete
(甚至不能这样做)
因此,它自己的析构函数和包装类型的析构函数永远不会被调用
use_count()返回值为1,因此我认为拥有该对象的最后一个剩余共享_ptr将被销毁,并因此调用析构函数
在这种情况下,情况并非如此,因为您正在动态分配共享的ptr
,并且从不销毁它弱的ptr
不会销毁它所指的共享的ptr
。当您调用锁()
要获取一个新的共享\u ptr
,共享对象的use\u count()
增加到2,然后在共享\u ptr
fromlock()
超出范围时,按预期减少到1。但是use\u count()
仍然是>0,因为第一个共享的\u ptr
仍然挂在堆内存中。共享的\u ptr
本身没有引用计数,您仍然必须像任何其他类一样分配和销毁它。它只管理它共享的对象的引用计数
如果我想像这样维护结构:newstd::shared_ptr(newfoo)并调用析构函数,我应该怎么做
使用完后,您必须明确地删除共享\u ptr
:
new std::shared_ptr<Foo>(new Foo))
“奇异”可能太弱了;)是的,我应该像这样销毁动态分配的共享\u ptr:std::shared\u ptr*jack=new std::shared\u ptr(new Foo);删除jack;好吧,我只是四处探索,所以代码看起来很尴尬。不管怎样,你的提示帮助我,尽管这个问题真的很糟糕。@Vito:首先不要动态分配它。@LightnessRacesinOrbit“首先不要动态分配它。”尤其是在不使用变量来保存结果指针的情况下。动态分配共享\u ptr
是绝对没有意义的。
int main()
{
std::shared_ptr<Foo> *jill = new std::shared_ptr<Foo>(new Foo);
{
std::weak_ptr<Foo> jack = *jill;
std::cout << jack.use_count() << std::endl;
// std::shared_ptr<Foo> ptr = jack.lock();
// std::cout << ptr.use_count() << std::endl;
}
delete jill;
return 0;
}
int main()
{
std::shared_ptr<Foo> jill(new Foo);
//std::shared_ptr<Foo> jill = std::make_shared<Foo>();
std::weak_ptr<Foo> jack = jill;
std::cout << jack.use_count() << std::endl;
// std::shared_ptr<Foo> ptr = jack.lock();
// std::cout << ptr.use_count() << std::endl;
return 0;
}