【问题标题】:vector::emplace_back result to call destructor twicevector::emplace_back 结果调用析构函数两次
【发布时间】:2020-10-03 06:23:27
【问题描述】:

简单程序写成:

#include <iostream>
#include <vector>
using std::vector;

class Test {
public:
    Test( int d ) : data(d), addr(&data) {

    }
    // Test( Test &src ) : data(src.data), addr(src.addr) { }
    const int data;
    const int *addr;
    ~Test() {
        delete addr;
    }
    void print() {
        std::cout << " Data is : " << data << '\n';
    }
};

int main( int, char**, char** ) {

    std::vector<Test> data1;
    data1.emplace_back( 98 );

    for( auto a : data1 )
        a.print();
    std::cout << "main";
    std::cout << std::endl;
    return 0;
}

输出是

可能是因为析构函数被调用了两次 我试图从 herethere 获取一些信息但无法获得清晰的视觉。

【问题讨论】:

  • delete addr; 两次?一定是笔误。无论如何,您应该只在 newed 的指针上调用 delete
  • addr 不是从new 返回的指针。将其传递给 delete 具有未定义的行为。为什么你认为你需要delete 任何东西? (delete 不是为了摆脱指针,而是为了摆脱指针指向的内容,并且如果该东西是在免费商店中使用new 创建的。)
  • 哦!那是我出错的地方。是的,我假设当调用默认构造函数时,它会动态分配地址。反正现在已经解决了。

标签: c++ vector c++17 destructor dynamic-memory-allocation


【解决方案1】:

如 cmets 中所述,问题在于析构函数中的 delete 语句,这对于非动态数据成员来说是不需要的。

【讨论】:

    猜你喜欢
    • 2014-03-05
    • 2013-08-18
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多