C++在哪里调用析构函数?

Where C++ calls destructors?

假设MemberMyList是两个用户定义的类。在以下代码中:

void fillList(MyList &list1)
{
    Member m1("aaa");
    Member m2("bbb");
    list1.insert(m1);
    list1.insert(m2);   
}

void func1()
{
    MyList lst;
    fillList(lst);
    lst.printAll();
}

int main()
{
    func1();
    return 0;
}

C++ 在什么时候调用每个 m1m2lst 的析构函数?

假设 C++ 不会删除将再次使用的对象总是安全的吗?

At which point does C++ call destructor of each m1, m2 and lst?

析构函数在范围末尾以对象定义的相反顺序调用。在您的例子中,首先调用 func1(),它定义了 lst,然后调用 fillList(),它定义了 m1m2。接下来 fillList() 结束,所以现在 m2 然后 m1 析构函数被调用(按照它们声明的相反顺序)。最后 func1() 结束,所以 lst 析构函数被调用。

Is it always safe to assume C++ does not remove an object which will be used again?

我不太明白你的意思。被破坏的对象消失了,你不能再使用它了。尝试访问它(通过悬空 pointer/reference)只是未定义的行为。

析构函数在其范围结束时被调用(如果在 'stack' 上分配)或当您手动调用它们的 delete 运算符时(如果动态分配)。

关于您的其他问题,绝对 做出任何此类假设是安全的。 C++ 很乐意让你用一把钝锯锯断自己的腿。它可能会问你是否想要一些小猫形状的创可贴(你必须自己制作),但仅此而已。