全部
我有以下简单的代码。我为我的类定义了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)
答案 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
免费。