昨天一个原本运行良好的工程发生了下述错误:
*** glibc detected *** corrupted double-linked list: 0x00000000005ab150 ***
进程崩溃,显示底层发送了一个段错误信号。
/////////////////////////////////////////////////////////////////////////////////////////
遂上网搜索,引用一下别人的文章: *** glibc detected *** free(): invalid pointer: 内存问题始终是c++程序员需要去面对的问题,这也是c++语言的门槛较高的原因之一。通常我们会犯的内存问题大概有以下几种: /////////////////////////////////////////////////////////////////////////////////////////
我检查了工程大多数new delete以及strcat,vsprintf,memcpy, memset,
memmove等一些内存操作函数的地方,都没有发现问题。
不断调试发现每次发生问题的地方还不太一样。 但大多(不是全部)似乎和一个类(姑且称作类A)有关,理由是: 1) 我发现这个类A没有正常delete,于是我加了一句delete: 但,居然在delete类A的时候发生该异常。 2) 于是我把new A的语句提前,放在另一个类B构造函数里,然后仅在类B的析构函数里delete。 但,发生该异常的错误居然提前到类B构造函数之后的另一个类C的new的地方。 3)其他莫名其妙出错的地方都发生在new类A的之后。 因为这个类A是属于一个动态库里的,我第一时间怀疑是不是头文件和库文件不一致导致的。因为这个类A在其他工程里运行良好。 于是从其他工程里复制其头文件,覆盖本工程。 重新编译工程,运行,再也不出错了。 因为发生这个错误情况,网上大多把错误原因归咎于内存泄露,所以我觉得有必要记录一下我这个解决办法。
|
|