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
from
lock()
超出范围时,按预期减少到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;
}