gpt4 book ai didi

c++ - 调查错误的 free() 指针引用

转载 作者:太空宇宙 更新时间:2023-11-04 12:18:54 25 4
gpt4 key购买 nike

由于对错误指针的 free() 调用,我的程序在单一测试中严重崩溃,并显示以下错误消息:

*** glibc detected *** /home/user/main.out: free(): invalid pointer: 0x006d0065 ***

代码大致如下:

// constructor is MyObj( const std::string & ) 
// and copies the string in its own std:string member
MyObject *obj = new MyObject("some string arg");
if(obj->isValid)
{
log("Success\n");
}
delete obj; // if I remove this, the program doesn't crash...

我的调查经历了这个:

  1. 我试图跟踪我创建和释放的指针,但它发生在不同的地址空间中,我得到(成功的)删除,如下所示:Delete buffer @0x850ed0。所以我怀疑有什么东西试图释放一个静态字符指针。此外,该地址在多次尝试后都保持不变,这让我对此断言感到欣慰。

  2. 我不能使用 GDB,因为我正在使用的平台似乎可以退出:

    程序收到信号 SIGABRT,中止。
    [切换到线程 0x344314e8 (LWP 1443)]
    0x2a3dd658 in raise () from/lib/libc.so.6
    (gdb) bt
    #0 0x2a3dd658 in raise () from/lib/libc.so.6
    #1 0x2a3dea2c in abort () from/lib/libc.so.6
    回溯停止:帧没有保存 PC

  3. 我尝试使用 hexdump 转储程序中 free() 失败的地址:hexdump -C ~/main.out -s 0x6d0000 -n 2000

    它给了我这个(错误是 free(0x6d0065)):

    006d0060 e8 32 06 00 2c e6 02 5f 5a 4e 4b 53 73 34 66 69 |.2..,.._ZNKSs4fi|006d0070 6e 64 45 63 6a 00 ab 00 00 00 01 3e 58 00 00 1d |ndEcj......>X...|

    这看起来像一个 std::string 函数,这很奇怪......我认为这可能是对 hexdump 的错误使用,因为当程序加载到内存中时内存会重新定位。

  4. 我试过 readelf ~/main.out -a | grep 6d0065 也无济于事(没有命中)

我不是在这些条件下进行调试的专家;你知道我怎样才能知道这个地址对程序意味着什么吗?

编辑:

  • 程序在嵌入式平台(SH4)上运行; valgrind 不支持(非常遗憾...)。

  • 关于这个类做什么的更多细节:它使用 CUrl library在 Internet 上检索 XML 文件,然后继续使用 pugixml 对其进行解析图书馆。

最佳答案

在黑暗中疯狂射击......你有一个没有虚拟析构函数的基类,你实际上是在实例化一个派生类并将 new 的结果存储在指向基类的指针中。您通过基指针删除,并且在这种特殊情况下未定义的行为导致了这种影响。

我为什么这么认为?传递给 free 的指针malloc 未返回,因为它是一个奇数地址,所以无法正确对齐,并且 malloc始终提供对齐的内存块。这意味着 new 返回的指针的内存并且存储的指针有一个偏移量,这表明它可能是一个基类。如果该类有一个虚拟析构函数,那么 delete将能够确定最派生的对象类型,并且在这样做时,它将更正指针以引用分配给 new 的地址。 .如果没有虚拟析构函数,delete正在转化为obj->~MyObject(); free( obj );不校正偏移量。

可能导致相同类型问题的另一件事是分配 new[] , 并使用 delete 解除分配(new[] 将分配额外的空间来存储元素的数量,通常在返回的指针之前)。同样,问题是传递给 free 的指针通过实现delete未更正以匹配 malloc 返回的那个...但在这种特殊情况下,偏移量可能不是奇数。

关于c++ - 调查错误的 free() 指针引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6201695/

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