析构函数被调用两次。

3
编辑:事实证明,无论我是否使用向量,这种情况都会发生。这与函数本地对象具有自动销毁有关,尽管我试图显式调用析构函数。
我正在努力弄清楚为什么我的对象显然被删除了两次。我正在尝试使用 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

最后一个对象被析构了两次。我试图弄清楚发生了什么。似乎向向量传递的按值复制参数没有调用构造函数。有人能帮我解决这个问题吗?谢谢!

类头文件如下:

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

你确定向量与此有关吗?你尝试过将其移除吗?(反问句) - juanchopanza
实际上,我刚刚把它移除了,你是对的,向量并不是问题的一部分。 - Enigma22134
void main 会产生未定义行为,因为它是无效的。在此之后,您将没有任何保证。 - Cheers and hth. - Alf
1
它被称为 析构函数 而不是 解构函数 - rrauenza
1
你为什么要自己调用析构函数??? - kfsone
显示剩余6条评论
5个回答

3

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

一次是在你显式地析构它时,另一次是在函数结束时,所有局部变量自动销毁。这是未定义的行为。

你几乎不应该手动调用析构函数。


3
DummyClass test;

这个对象在main函数中,当main函数返回时,它将超出作用域。(1个析构函数被调用)

objVect1.push_back(test);

DummyClass的一个副本添加到std::vector中。

objVect1.clear();

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

test.~DummyClass()

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

如上所示,针对2个对象实例,析构函数被调用了3次。应该移除显式的析构函数调用。


0

在 main 结束时,您无需调用析构函数。一旦 "test" 超出范围,它就会自动调用。删除 main 的最后一行即可。


0

push_back()将test复制到向量中。当向量被clear()清除时,第一次调用析构函数,并销毁向量中的副本。

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

第三次是在main()返回并真正销毁test时。


0

我不能发表评论,但我认为第一个调用是在clear之后进行的,而test对象被销毁;第二个调用是由您的调用触发的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接