Pla*_*aHH 11 c c++ memory glibc
您很可能会看到这个问题,因为您的问题已被关闭,因为它与此相关.有关相关问题的中等完整列表,请参阅可能重复的长列表 -元数据库溢出中的C内存分配和超限界限.
来自免费char*:无效的下一个尺寸(快)由noobie在2014-04-11 问.
我char*
在连接过程后释放了一个,但是我收到了这个错误:
free(): invalid next size (fast): 0x0000000001b86170
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
void concat(stringList *list) {
char *res = (char*)malloc(sizeof(char*));
strcpy(res, list->head->string);
list->tmp = list->head->next;
while (list->tmp != NULL) {
strcat(res, ",");
strcat(res, list->tmp->string);
list->tmp = list->tmp->next;
}
printf("%s\n", res);
free(res);
}
Run Code Online (Sandbox Code Playgroud)
运行我的程序时,我看到如下错误消息:
*** glibc detected *** ./a.out: free(): corrupted unsorted chunks: 0x12345678 ***
Run Code Online (Sandbox Code Playgroud)
详细信息可以包含以下任何一个*** glibc detected ***
和程序名称之后的消息,后面跟一个十六进制地址(显示为0x12345678)和另一个***
:
free(): corrupted unsorted chunks: 0x12345678
free(): invalid next size (fast): 0x12345678
free(): invalid next size (normal): 0x12345678
free(): invalid pointer: 0x12345678
free(): invalid size: 0x12345678
malloc(): corrupted unsorted chunks: 0x12345678
malloc(): corrupted unsorted chunks 2: 0x12345678
malloc(): memory corruption: 0x12345678
malloc(): memory corruption (fast): 0x12345678
malloc(): smallbin double linked list corrupted: 0x12345678
munmap_chunk(): invalid pointer: 0x12345678
realloc(): invalid next size (fast): 0x12345678
realloc(): invalid old size (fast): 0x12345678
realloc(): invalid pointer: 0x12345678
corrupted double-linked list: 0x12345678
调用frobnicate()
函数时会发生这种情况; 这个功能出了什么问题?
Pla*_*aHH 12
你的代码错了.
您为单个指针(
malloc(sizeof(char*))
)分配空间,但没有字符.您将使用所有字符串覆盖已分配的空间,从而导致未定义的行为(在此特定情况下,会损坏malloc()
的簿记数据).您不需要为指针(
res
)分配空间; 这是一个局部变量.您必须为希望存储在指针所占地址的所有字符分配空间.由于您将遍历列表以查找要连接的字符串,因此您无法预先知道总大小.您将不得不在列表上进行两次传递:一次对
strlen()
每个字符串求和,然后为分隔符和终止符分配该空间,然后在实际进行连接时再传递一次.
你看到的是glibc分配器内部结构损坏的结果.当您分配或释放动态内存时,分配器必须管理它从操作系统保留的内存,并根据您请求的操作,找到要分发的新块,将释放的块排序到它的列表中可以再次发出,或者将内存返回给操作系统.这些错误消息表明它用于管理此功能的数据结构已损坏.
这些错误都意味着一些代码的修改了,这是不给用,调用存储未定义的行为.这很可能是在程序中更早地覆盖一些内存的结果,并且错误完全可能不在frobnicate()
函数中.
是的,这意味着错误可能出现在您的程序中的任何位置或您使用的第三方库中.
这可能不是Stack Overflow的好问题.除非您对问题进行简单的简单复制,否则此社区可能无法为您提供帮助.错误的原因可能是代码中的任何位置(并且通常不在发现错误的函数中),并且它可能在我们看不到的代码中.Stack Overflow 不是协作调试站点.即使有人可以在您的代码中找到缺陷,您的具体问题也不太可能对未来的访问者有所帮助.
long *data = malloc(number * 4)
不是long *data = malloc(number * sizeof(long));
或(更好)long *data = malloc(number * sizeof(*data));
.还有许多其他方法可以使尺寸计算错误.另一个常见的问题是忘记在字符串末尾考虑空终止符:char *copy = malloc(strlen(str));
而不是char *copy = malloc(strlen(str)+1);
.你现在需要做的就是卷起袖子并调试这个问题
没有简单的答案可以寻找什么,或者要修复什么.没有一个你使用错误的单一语法结构.这个bug的原因可能有几千种.
exp-sgcheck
工具.如果您正在运行多线程代码,原因可能也与竞争条件有关,因此您可能希望尝试包含的竞争条件检查器drd
以及helgrind
更多洞察力.在撰写本文时,valgrind支持以下平台:
如果使用这些工具无法解决问题,则应尝试创建MCVE(如何创建最小,完整和可验证的示例?)或等效的SSCCE(短,自包含,正确(可编译)) ,例子).
请记住处理代码的副本,因为创建MCVE需要您无情地删除无助于重现问题的代码.使用VCS(版本控制系统)来提供帮助是一个好主意; 您可以记录将问题降至最低的中间阶段.它可能是一个新的丢弃存储库,只是为了将您的问题减少到可管理的大小.
通过良好的模块化设计,您可以相对轻松地创建MCVE.也许您已经有一个单元测试,更适合用于上述工具之一.您也可能只想创建一个以后可以作为此错误的回归测试.