首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >析构函数调用两次

析构函数调用两次
EN

Stack Overflow用户
提问于 2016-06-07 23:05:25
回答 5查看 1.9K关注 0票数 3

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

我想弄清楚为什么我的目标被删除了两次。我正在试验std::vector类,并希望了解如何处理对象的删除。有人能告诉我在这种情况下发生了什么吗?

代码:

代码语言:javascript
复制
#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?

控制台输出:

代码语言:javascript
复制
0033F9DB was constructed
0062C200 was destructed
0033F9DB was destructed
0033F9DB was destructed

最后一个物体被破坏了两次。我想弄清楚到底是怎么回事。似乎没有为传递到向量的按值复制参数调用构造函数。有人能帮我弄清楚吗?谢谢!

类标题是:

代码语言:javascript
复制
#pragma once
#include<iostream>
class DummyClass
{
public:
    DummyClass();
    ~DummyClass();
};

cpp班是:

代码语言:javascript
复制
DummyClass::DummyClass()
{    
    std::cout << this << " was constructed" << std::endl;
}

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

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-06-07 23:10:05

最后一个物体被解构了两次。

一次当您显式地解构它,然后再一次当函数结束时和函数的所有局部变量自动析构。这是未定义的行为。

你几乎不应该亲自打电话给破坏者。

票数 3
EN

Stack Overflow用户

发布于 2016-06-07 23:13:22

代码语言:javascript
复制
DummyClass test;

此对象位于main函数中,当main返回时将超出范围。(1名破坏者)

代码语言:javascript
复制
objVect1.push_back(test);

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

代码语言:javascript
复制
objVect1.clear();

当调用clear时,该副本将被销毁。(1名破坏者)

代码语言:javascript
复制
test.~DummyClass()

您不应该显式地调用这个析构函数,当对象超出作用域时(即当main函数返回时),它会自动发生。(1名破坏者)

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

票数 3
EN

Stack Overflow用户

发布于 2016-06-07 23:10:42

你不需要在主指令结束时调用析构函数。一旦“测试”超出范围,就会自动调用它。移除主板的最后一行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37690829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档