我有一个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的愚蠢/列表的创建。希望这会有所帮助。
答案 0 :(得分:7)
delete
运算符在引擎盖下执行2个函数
鉴于打印输出确认#1正在发生,最可能的原因是在实际释放内存期间崩溃(该消息也表明了这一点)。这通常表示内存已被程序的另一部分损坏。
您是否尝试过在valgrind下运行程序?
答案 1 :(得分:6)
看起来我们老朋友“未定义的行为”。
可能foolist
被删除两次。你重载了类的复制构造函数和赋值运算符吗?如果没有,你应该读这个:
What is The Rule of Three?
答案 2 :(得分:2)
你可以双重删除它 - 甚至是无意中违反了三条规则。您可以更改指针的值 - 例如递增它。您可以对其进行多态转换,例如Base* ptr = new Derived[size]; delete[] ptr;
这也是未定义的行为。
课程:始终,始终使用智能指针。