【问题标题】:Delete dynamically allocated memory twice?两次删除动态分配的内存?
【发布时间】:2014-01-19 11:13:03
【问题描述】:

首先我想指出我使用的是 GNU GCC 编译器。我使用 Code::Blocks 作为我的 IDE,因此我不必在 Windows DOS 命令提示符中输入所有编译器垃圾。如果我可以更具体地了解我的编译器,当我成功编译时,在 Cod::Blocks 底部显示的一行是

mingw32-g++.exe -std=c++11 -g 

无论如何,我的问题涉及使用删除运算符来释放动态分配的内存。当我编译这段代码 sn-p:

int* x;
x = new int;
delete x;
delete x;

我没有收到任何警告、错误或崩溃。从我正在学习 C++ 的书中,释放指向动态分配的内存卡盘的指针只能执行一次,然后指针无效。如果再次对同一个指针使用delete,就会出现问题。但是,我不明白这个问题。

同样,如果我将一个对象按值传递给一个函数,这样它就被浅拷贝了,如果我没有一个拷贝构造函数来确保深拷贝(在对象中使用原始指针),我不会出错。这意味着当函数返回时,浅拷贝超出范围,并调用其析构函数(我在指针上使用 delete)。当 int main 返回时,原始对象超出范围,调用其析构函数,并删除相同的浅拷贝指针。但我没有问题。

我尝试在线查找有关我正在使用的编译器的文档,但找不到任何文档。这是否意味着 mingw32 编译器使用了某种默认的复制构造函数?因此,我不必担心创建复制构造函数?

【问题讨论】:

  • 你没有遇到任何问题,因为你很幸运。我建议立即购买一堆强力球门票。

标签: gcc memory compiler-construction delete-operator


【解决方案1】:

编译器文档在这种情况下可能没有帮助:如果存在,它可能会列出 C++ 规范的例外情况。这是您需要的 C++ 规范。

当你删除同一个指针两次时,结果——根据 C++ 规范——是 undefined。编译器可以做任何事情并使其符合规范。允许编译器识别错误并给出错误消息,或者不识别错误并立即或稍后崩溃。 这次你的编译器似乎可以工作,这并不表明双重删除是安全的。它可能会以某种方式破坏堆,从而导致稍后出现段错误。

如果您没有定义复制构造函数,C++ 会为您定义一个。默认的复制构造函数会进行成员复制。

当你有多个指针指向同一个对象时,比如你这样做,考虑使用std::smart_ptr

【讨论】:

    猜你喜欢
    • 2011-06-17
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 2017-05-08
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    相关资源
    最近更新 更多