重载operator new而不重载operator delete

时间:2010-10-30 14:02:52

标签: c++ memory-leaks

全部

我有以下简单的代码。我为我的类定义了operator new而没有operator delete。 根据{{​​1}}我有一个不匹配,即我正在使用valgrind --leak-check=yes PROGRAM_NAME为数组分配,但我正在使用简单的new[]取消分配非数组。你知道为什么吗?

此致 AFG

delete

}

==2767== Mismatched free() / delete / delete []
==2767==    at 0x4024851: operator delete(void*) (vg_replace_malloc.c:387)
==2767==    by 0x80488BD: main (operator_new_test.cpp:54)
==2767==  Address 0x42d3028 is 0 bytes inside a block of size 1 alloc'd
==2767==    at 0x4024F20: malloc (vg_replace_malloc.c:236)
==2767==    by 0x80489A4: CA::operator new(unsigned int) (operator_new_test.cpp:18)
==2767==    by 0x804887B: main (operator_new_test.cpp:53)

3 个答案:

答案 0 :(得分:8)

您的重载运算符new使用malloc,但随后您使用普通的C ++ delete运算符解除分配。这是一个经典错误。如果您使用malloc进行分配,则必须始终取消分配free。如果您使用new进行分配,则必须始终取消分配delete(或在数组的情况下为delete[]。)

您需要重载delete运算符并让其调用free()

答案 1 :(得分:1)

当你重载operator new时,必须重载操作符delete才能让你知道正确的释放函数(在这种情况下是自由的)被调用。

你的过载也存在一些问题;见my example on overloading new。只需用免费的malloc和deallocate_from_some_other_source替换allocate_from_some_other_source。

答案 2 :(得分:0)

如果您使用malloc进行分配,则可以使用free免费。