C++ 为什么类的析构函数调用了两次?

C++ 为什么类的析构函数调用了两次?,c++,destructor,C++,Destructor,抱歉,如果这个问题听起来很愚蠢,我是在跟随SO的专家,并尝试了一些例子,这就是其中之一。我确实尝试了搜索选项,但没有找到这种类型的答案 class A { public: A(){cout<<"A Contruction"<<endl;} ~A(){cout<<"A destruction"<<endl;} }; int main() { vector<A> t; t.push

抱歉,如果这个问题听起来很愚蠢,我是在跟随SO的专家,并尝试了一些例子,这就是其中之一。我确实尝试了搜索选项,但没有找到这种类型的答案

class A
{
    public:
         A(){cout<<"A Contruction"<<endl;}
        ~A(){cout<<"A destruction"<<endl;}
};

int main()
{
    vector<A> t;
    t.push_back(A()); // After this line, when the scope of the object is lost.
}
A类
{
公众:

A(){cout要添加元素,将在临时对象上调用复制构造函数
临时对象被销毁-这不是第一次析构函数调用。然后
向量
实例超出范围并销毁所有存储的元素-这是第二次析构函数调用。

当发送到
push_back
的临时对象被销毁时,析构函数被调用一次;当
t
i中的元素被销毁时,析构函数被调用一次它已被销毁。

这将向您展示以下内容:

结构A{
A(){cout最有可能的情况是,正在创建对象的副本。因此,复制对象和原始对象的析构函数使调用计数为2

示例:即使将对象引用传递给某个类,这也会在内部调用复制构造函数

Parent *const &p parentRef;  //Child.h
然后,父对象将被传递为

// Parent.cpp
Parent *parentObj = this;
Child *childObj = Child(parentObj);
此外,您可以通过重写来调试复制构造函数调用

Parent(const Parent& object){
        cout <<"copy called.." << endl;
}
...
父对象(常量父对象和对象){

cout有两个析构函数调用,因为有两个对象:
push_back
的参数和
vector
t
中新添加的元素

存储副本。在您的示例中,通过副本添加到
向量的元素是根据传递到
push_back
的参数构造的。参数是
A()
,它是一个临时对象,请参阅

稍微扩展一下答案,尽管你没有明确要求:知道临时文件何时被销毁可能很有用。标准()在12.2 p3中非常清楚地说明了这一点:

…临时对象将被销毁,作为评估 完整表达式(1.9)(在词汇上)包含 被创造


旁注:如果使用,则只有一个对象。容器中的新元素直接从emplace_back的参数构造。许多STL容器在C++11中学习了emplace变体。

不这样认为支持
标记。不过,也许meta?m上的功能请求认为Jeff会喜欢它!:-)@pst:谢谢,我在编辑,还没来得及保存就完成了。只是想知道,为什么这个社区wiki?@dicprio:a follow[]和
t.emplace_back()
,而不是(C++0x),只有一个对象,只有一个析构函数调用。@sharptooth&@Andreas:谢谢。我刚看到你的回复后,定义了一个复制构造函数a(康斯塔&)是的,它会被调用。@dicaprio:当然,在你定义自己的复制构造函数之前,编译器使用自己自动生成的复制构造函数。!罗杰:在你发布这篇文章之前,我也尝试过同样的方法,我明白了,谢谢!!我们如何允许复制构造函数正确复制并使用
cout
而不调用自己并启动constructor?是唯一一个逐个分配字段的吗?
Parent(const Parent& object){
        cout <<"copy called.." << endl;
}
...