删除动态分配的内存两次?

时间:2014-01-02 02:50:32

标签: gcc memory compiler-construction delete-operator

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

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

无论如何,我的问题涉及使用delete运算符释放动态分配的内存。当我编译这段代码片段时:

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

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

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

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

1 个答案:

答案 0 :(得分:1)

在这种情况下,编译器文档可能没有用处:如果存在,则很可能列出C ++规范的异常。这是你需要的C ++规范。

当您删除两次相同的指针时,结果 - 根据C ++规范 - 是 undefined 。编译器可以做任何事情并使其符合规范。允许编译器识别故障并给出错误消息,或者不识别故障并立即或稍后爆炸。你的编译器似乎这次并不表示双重删除是安全的。它可能会以稍后导致seg故障的方式混乱堆栈。

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

当你有多个指针所指向的同一个对象时,请考虑使用std::smart_ptr