析构函数调用了两次

时间:2016-06-07 23:05:25

标签: c++ vector

编辑:事实证明,无论我是否使用向量,都会发生这种情况。尽管我试图显式调用析构函数,但它与具有自动销毁功能的本地对象有关。

我试图找出为什么我的对象显然被删除了两次。我正在尝试使用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

最后一个对象被破坏了两次。我想知道发生了什么。似乎没有构造函数调用传递给向量的copy-by-value参数。任何人都可以帮我解决这个问题吗?谢谢!

班级标题是:

#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;
}

5 个答案:

答案 0 :(得分:3)

  

最后一个对象被解构了两次。

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

你几乎不应该自己打电话给析构函数。

答案 1 :(得分:3)

DummyClass test;

此对象位于main函数中,并且在main返回时将超出范围。 (1个析构函数)

objVect1.push_back(test);

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

objVect1.clear();

调用clear时,副本将被销毁。 (1个析构函数)

test.~DummyClass()

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

在显式调用析构函数时,第二次调用析构函数。

第三次main()返回时,test真正被破坏。

答案 4 :(得分:0)

我无法发表评论,但我认为第一次调用是在clear之后进行的,test对象已经失效了;第二个是你的电话。