gpt4 book ai didi

c++ - Valgrind 报告不匹配的 free()/delete/delete []

转载 作者:可可西里 更新时间:2023-11-01 17:59:58 44 4
gpt4 key购买 nike

我正在编写一个可以在多个系统上运行的库(其中一些没有 malloc 或 stdlib)。在我的标准库(不同的库)中,我覆盖了 newdelete 运算符以对函数进行通用调用(此示例没有这些函数)。每个系统都会将这些通用调用覆盖到它们各自的内存分配设备。

问题是当我尝试这样做时。下面是一些精简的示例代码来重现该问题:

#include <cstdlib>

void* operator new(unsigned long size) {
return std::malloc(size); // would normally call an intermediate function which would be overridden by the system
}

void operator delete(void* object) {
std::free(object); // would normally call an intermediate function which would be overridden by the system
}
void operator delete(void* object, unsigned long size) {
std::free(object); // would normally call an intermediate function which would be overridden by the system
}

class MyClass {

};

int main() {
MyClass* myClass = new MyClass();
delete myClass;
}

当我使用纯 gcc-6(无参数)构建它并使用 valgrind(无参数)运行时,出现此错误:

==11219== Mismatched free() / delete / delete []
==11219== at 0x4C2DD6B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==11219== by 0x108730: operator delete(void*, unsigned long) (in /home/chris13524/tmp/test.o)
==11219== by 0x10875A: main (in /home/chris13524/tmp/test.o)
==11219== Address 0x5200040 is 0 bytes inside a block of size 1 alloc'd
==11219== at 0x4C2D1AF: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==11219== by 0x108745: main (in /home/chris13524/tmp/test.o)

看起来 delete 运算符工作正常,但 Valgrind 正在覆盖我覆盖的 new 运算符。知道如何解决这个问题吗?

删除中间函数不是一个选项,因为我还有其他代码。

它如何在我的真实程序中运行的示例(同样,我的示例中未显示):

new => create => <intermediate code> => createImpl => malloc
create => <intermediate code> => createImpl => malloc

我正在使用 gcc v6.2.0、valgrind v3.12.0 和 Ubuntu 16.10。

最佳答案

感谢 Paul Floyd,此错误已在提交 6ef6f738a 中修复.查看错误报告 here .

但是,此修复程序尚未发布(截至 2018 年 6 月),可能需要更长时间才能出现在发行版中。如果您现在需要此修复,我建议从 source 构建.

关于c++ - Valgrind 报告不匹配的 free()/delete/delete [],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40509986/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com