段错误:smallbin double linked list corrupted

闻人吕恭
2023-12-01

昨天一个原本运行良好的工程发生了下述错误:
*** glibc detected *** corrupted double-linked list: 0x00000000005ab150 ***
进程崩溃,显示底层发送了一个段错误信号。

/

遂上网搜索,引用一下别人的文章:

*** glibc detected *** free(): invalid pointer:
*** glibc detected *** malloc(): memory corruption:
*** glibc detected *** double free or corruption (out): 0x00000000005c18a0 ***
*** glibc detected *** corrupted double-linked list: 0x00000000005ab150 ***

内存问题始终是c++程序员需要去面对的问题,这也是c++语言的门槛较高的原因之一。通常我们会犯的内存问题大概有以下几种:
1.内存重复释放,出现double free时,通常是由于这种情况所致。
2.内存泄露,分配的内存忘了释放。
3.内存越界使用,使用了不该使用的内存。
4.使用了无效指针。
5.空指针,对一个空指针进行操作。

/
我检查了工程大多数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在其他工程里运行良好。

于是从其他工程里复制其头文件,覆盖本工程。

重新编译工程,运行,再也不出错了。


因为发生这个错误情况,网上大多把错误原因归咎于内存泄露,所以我觉得有必要记录一下我这个解决办法。


        



 类似资料: