两次调用析构函数

时间:2009-12-25 06:26:20

标签: c++

以下代码:

#include<iostream>
#include<vector>
#include<string>
using namespace std;

 struct Test
 {

    string Str; 
    Test(const string s) :Str(s)
    { 
         cout<<Str<<" Test() "<<this<<endl;
    }
    ~Test()
    { 
         cout<<Str<<" ~Test() "<<this<<endl; 
    }
 };

 struct TestWrapper
 {
    vector<Test> vObj;
    TestWrapper(const string s)
    {
       cout<<"TestWrapper() "<<this<<endl;
       vObj.push_back(s);
    }

    ~TestWrapper() 
    { 
       cout<<"~TestWrapper() "<<this<<endl;
    }
 };

int main ()
{
   TestWrapper obj("ABC");
}

这是我在MSVC ++编译器上得到的输出:

TestWrapper()0018F854
ABC测试()0018F634
ABC~Test()0018F634
~TestWrapper()0018F854
ABC~Test()003D8490

为什么只有两个Test析构函数调用,尽管只创建了一个Test对象。两者之间是否创建了临时对象?如果是,为什么没有调用其相应的构造函数?

我错过了什么吗?

3 个答案:

答案 0 :(得分:6)

您的输出不考虑Test的复制构造函数,std::vector易于使用。

您看到的Test对象是临时传递给push_back()的,而不是vector中实际存在的那个。

答案 1 :(得分:2)

我认为

vObj.push_back(s);

涉及sTest的隐式演员。所以实际发生的是

vObj.push_back(Test(s));

,临时对象在复制到向量后会被破坏。

向量中的对象是使用复制构造函数(而不是(const string s)构造函数)构造的,这就是为什么你没有看到对应于析构函数调用的任何构造函数调用。

答案 2 :(得分:2)

尝试将复制构造函数添加到Test:

Test(const Test &obj)
{ 
    cout<<obj.Str<<" Test() "<<this<<endl;
    Str = obj.Str;
}

您也会看到正在调用复制构造函数,此调用在将对象放入向量时发生。所以我们有两个构造函数调用和两个析构函数调用。