了解“双重免费或腐败”错误

时间:2015-09-02 12:52:34

标签: c++ memory

我正在调用C++脚本(OS Ubuntu 14.04)中的python应用程序,如下所示:

import sys, subprocess
run = subprocess.Popen(['app'] + args, stdout = subprocess.PIPE,
                       stderr = subprocess.PIPE)
stdout, stderr = run.communicate()
if stderr:
    sys.stderr.write('Error in app: ' + stderr.decode('utf-8'))
    sys.exit(1)

然后我收到以下错误消息(虽然每次地址都不同):

*** Error in `/usr/bin/app': double free or corruption (!prev): 0x00007f50eae98070 ***

应用程序本身是第三方二进制文件,这意味着我无法访问源代码。然而,即使建议app中有一些错误导致删除尝试同一个实体两次,但我无法理解的行为有3个陌生:

  1. 错误随机发生,相当罕见(大约20%的运行在同一数据上)。 app的其他一些用户也会收到此错误;然而,有些人从来没有得到它。
  2. 它不会被子进程的stderr流捕获(因此sys.exit(1)不会被执行)。
  3. 有时我会在括号中看到top而不是!prev
  4. 有人可以解释一下,这些功能是如何产生的,甚至可以给出一个再现这种行为的C ++代码示例?

1 个答案:

答案 0 :(得分:4)

Double free正是它的含义:

$ rvm osx-ssl-certs status all
Certificates for /usr/local/etc/openssl/cert.pem: Up to date.
Certificates for /etc/openssl/cert.pem: Up to date.

腐败之类的东西:

int *a = new int;
delete a;
delete a;

当应用程序请求释放已释放的某些内存,或者该地址与分配时获得的地址不对应时,glibc生成此消息。