首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Valgrind报告不匹配free() / delete / delete []

Valgrind报告不匹配free() / delete / delete []
EN

Stack Overflow用户
提问于 2016-11-09 23:00:43
回答 1查看 3.3K关注 0票数 9

我正在编写一个可以在多个系统上运行的库(其中一些系统没有malloc或stdlib)。在我的stdlib (不同的库)中,我覆盖了newdelete操作符,以便对函数进行通用调用(本例中没有这些函数)。每个系统将覆盖对其各自的内存分配设备的这些通用调用。

问题是当我尝试这样做的时候。以下是一些简化的示例代码,用于重现该问题:

代码语言:javascript
复制
#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 (无参数)运行时,我得到这个错误:

代码语言:javascript
复制
==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操作符。你知道怎么解决这个问题吗?

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

它如何在我的实际程序中工作的示例(同样,在我的示例中没有显示):

代码语言:javascript
复制
new => create => <intermediate code> => createImpl => malloc
create => <intermediate code> => createImpl => malloc

我使用的是gcc v6.2.0、valgrind v3.12.0和Ubuntu 16.10。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-04 03:45:11

多亏了Paul Floyd,这个bug已经在commit 6ef6f738a中修复了。请参阅错误报告here

然而,这个修复还没有发布(截至2018年6月),可能需要更长的时间才能在发行版中显示出来。如果你现在需要这个修复,我建议从source开始构建。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40509986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档