2016-06-07 91 views
2

编辑:原来,无论我是否使用矢量这发生。它与具有自动销毁的函数的局部对象有关,尽管我试图显式调用析构函数。析构函数调用两次

我想弄清楚为什么我的对象显然被删除两次。我正在试验std :: vector类,并想知道如何处理删除对象。任何人都可以启发我在这种情况下发生了什么?

代码:

#include<iostream> 
#include<vector> 
#include"DummyClass.h" 
using namespace std; 

void main(void){ 
    //Make vector 
    vector<DummyClass> objVect1; 

    //Make objects to contain 
    DummyClass test; 

    //pass by value 
    objVect1.push_back(test); //makes a pass-by-value copy, I think? 


    //Delete the objects stored in the array 
    objVect1.clear(); // call dtor (vector's copy) 

    test.~DummyClass(); //call dtor on test 
}      //dtor called on test again? 

控制台输出:

0033F9DB was constructed 
0062C200 was destructed 
0033F9DB was destructed 
0033F9DB was destructed 

的最后一个对象被销毁两次。我想弄清楚发生了什么事。似乎没有传入构造函数的参数传递给vector。任何人都可以帮我解决这个问题吗?谢谢!

类的头是:

#pragma once 
#include<iostream> 
class DummyClass 
{ 
public: 
    DummyClass(); 
    ~DummyClass(); 
}; 

类CPP是:

DummyClass::DummyClass() 
{  
    std::cout << this << " was constructed" << std::endl; 
} 

DummyClass::~DummyClass() 
{ 
    std::cout << this << " was destructed"<< std::endl; 
} 
+0

你确定载体与此有关吗?你尝试删除它吗? (修辞问题。) – juanchopanza

+0

其实,我刚刚删除它,你说得对,矢量不是问题的一部分。 –

+0

'void main'产生**未定义的行为**,因为它无效。之后你没有任何保证。 –

回答

3

的最后一个对象解构两次。

一旦你明确地破坏它,然后再次当函数结束并且所有变量局部于该函数自毁时。这是未定义的行为。

你几乎不应该自己调用析构函数。

0

您不需要在main的结尾调用析构函数。一旦“测试”超出范围,它会自动调用。删除主要的最后一行。

0

push_back()将test复制到矢量中。当矢量得到clear()ed时,第一次调用析构函数,并且矢量中的副本被破坏。

析构函数在您显式调用它时被第二次调用。

第三次当main()返回,test真的被摧毁。

3
DummyClass test; 

这个对象是在main功能,将走出去的范围时main回报。 (1分析构函数调用)

objVect1.push_back(test); 

DummyClass的副本被添加到std::vector

objVect1.clear(); 

当调用clear时,副本被销毁。(称为1分析构函数)

test.~DummyClass() 

你不应该显式调用析构函数这个,它当对象超出范围自动发生(即,当main函数返回)。 (1析构函数调用)

析构函数被称为3次,如上所示,对于2对象实例。应该删除显式的析构函数调用。

0

我不能评论,但我认为第一个电话是在cleartest被删除对象后发出的;第二个是你的电话。