代码之家  ›  专栏  ›  技术社区  ›  flopex

如果在C++中释放指针两次或更多,会发生什么?

  •  23
  • flopex  · 技术社区  · 16 年前
    int main() {
        Employee *e = new Employee();
    
        delete e;
        delete e;
        ...
        delete e;
        return 0;
    }
    
    7 回复  |  直到 6 年前
        1
  •  41
  •   TrebledJ    6 年前

    你得到了吗 如果你想 delete 对象多次通过指针。

        2
  •  19
  •   David Thornley    16 年前

    这是未定义的行为,所以任何事情都可能发生。

    可能发生的事情是不好的。通常,空闲存储是一个由空闲块和分配块组成的精心管理的系统,并且 new 和 delete 做簿记使一切保持一致的状态。如果你 删除 同样,系统可能会对无效数据执行相同的簿记,而空闲存储突然处于不一致的状态。这就是所谓的“堆损坏”。

    新的

        3
  •  13
  •   Crashworks    16 年前

    除了“未定义的行为”这句老话,意思是任何事情都有可能从无到有,成为通往主记忆中打开的地狱第七圈的大门, 在实践中

        4
  •  4
  •   John Ledbetter    16 年前

    你可能会冒险进入“未定义行为”领域。

    *** glibc detected *** ./cctest: double free or corruption (fasttop): 0x0000000000d59900 ***
    ======= Backtrace: =========
    /lib/libc.so.6[0x7f399f4cbdd6]
    /lib/libc.so.6(cfree+0x6c)[0x7f399f4d074c]
    ./cctest[0x400a7a]
    /lib/libc.so.6(__libc_start_main+0xfd)[0x7f399f474abd]
    ./cctest[0x400959]
    
        5
  •  3
  •   Stewart    16 年前

    在checked或debug构建中,通常会捕捉到这种情况,但它可能完全不被发现,并在以后造成严重破坏。当涉及到多个线程时,这一点尤其重要。

        6
  •  3
  •   Kate Gregory    16 年前

    如果你担心这可能发生在你的应用程序中,要么完全停止使用原始指针,这样你就不需要删除(例如切换到 shared_ptr NULL nullptr )在你删除它们之后。对空指针调用delete保证什么也不做。

    推荐文章