C++ 为什么类的析构函数调用了两次?
抱歉,如果这个问题听起来很愚蠢,我是在跟随SO的专家,并尝试了一些例子,这就是其中之一。我确实尝试了搜索选项,但没有找到这种类型的答案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
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;
}
...