析构函数成功时,delete []操作如何崩溃? (在C ++中)

时间:2011-08-30 15:55:33

标签: c++ arrays memory-management destructor delete-operator

我有一个Foo类,它有一个(简单的)析构函数。

其他一些类包含一个Foo对象数组(称为foolist),在该类的析构函数中,我这样做:

delete[] foolist;

崩溃(gdb显示它在这一行中崩溃)。然而,通过使用打印输出,我看到愚蠢的所有元素都在没有问题地完成它们的析构函数(运行的析构函数的数量也等于在这个数组中分配的对象的数量,所以它们都被破坏了)。代码中也没有其他的傻瓜删除。

我还确保傻瓜确实被初始化为数组,这样:

foolist = new Foo[number];

错误是:

*** glibc detected *** /home/bas/projects/trunk/main:
free(): invalid next size (fast): 0x080a0e80 ***

在这种情况下,什么可能导致delete []崩溃?

提前致谢!

这里也讨论了valgind的输出(statementNode是Foo,programNode是包含Foo列表的类)

==4111== 1 errors in context 1 of 2:
==4111== Invalid write of size 4
==4111==    at 0x804B6FA: Parser::parseProgram(std::string) (statementnode.h:35)
==4111==    by 0x80764D4: main (parser.h:35)
==4111==  Address 0x42d9bdc is 4 bytes after a block of size 32 alloc'd
==4111==    at 0x4025F53: operator new[](unsigned int) (vg_replace_malloc.c:299)
==4111==    by 0x804A81E: Parser::parseProgram(std::string) (programnode.h:21)
==4111==    by 0x80764D4: main (parser.h:35)

StatementNode:35是创建一个完全不同的对象。 ProgramNode:21是对StatementNodes的愚蠢/列表的创建。希望这会有所帮助。

3 个答案:

答案 0 :(得分:7)

delete运算符在引擎盖下执行2个函数

  1. 运行Destructors
  2. 免费记忆
  3. 鉴于打印输出确认#1正在发生,最可能的原因是在实际释放内存期间崩溃(该消息也表明了这一点)。这通常表示内存已被程序的另一部分损坏。

    您是否尝试过在valgrind下运行程序?

答案 1 :(得分:6)

看起来我们老朋友“未定义的行为”。

可能foolist被删除两次。你重载了类的复制构造函数和赋值运算符吗?如果没有,你应该读这个: What is The Rule of Three?

答案 2 :(得分:2)

你可以双重删除它 - 甚至是无意中违反了三条规则。您可以更改指针的值 - 例如递增它。您可以对其进行多态转换,例如Base* ptr = new Derived[size]; delete[] ptr;这也是未定义的行为。

课程:始终,始终使用智能指针。