Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么是glibc free/malloc/realloc无效下一个大小/无效指针错误,以及如何修复它?_C++_C_Memory_Glibc - Fatal编程技术网

C++ 什么是glibc free/malloc/realloc无效下一个大小/无效指针错误,以及如何修复它?

C++ 什么是glibc free/malloc/realloc无效下一个大小/无效指针错误,以及如何修复它?,c++,c,memory,glibc,C++,C,Memory,Glibc,您很可能看到此问题,因为您的问题已作为此问题的副本关闭。有关适当完整的相关问题列表,请参阅关于元堆栈溢出的 示例问题 来自2014年4月11日的询问 在串联过程之后,我正在释放一个char*,但收到以下错误: free(): invalid next size (fast): 0x0000000001b86170 这是我的代码: void concat(stringList *list) { char *res = (char*)malloc(sizeof(char*));

您很可能看到此问题,因为您的问题已作为此问题的副本关闭。有关适当完整的相关问题列表,请参阅关于元堆栈溢出的


示例问题 来自2014年4月11日的询问

在串联过程之后,我正在释放一个
char*
,但收到以下错误:

free(): invalid next size (fast): 0x0000000001b86170
这是我的代码:

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);
}

一般问题 运行程序时,我会看到如下错误消息:

*** glibc detected *** ./a.out: free(): corrupted unsorted chunks: 0x12345678 ***
详细信息可以在
***glibc检测到***
和程序名之后包含以下任何内容,消息后面是一个十六进制地址(显示为0x12345678)和另一个
***

  • free():损坏的未排序块:0x12345678
  • free():下一个大小无效(快速):0x12345678
  • free():下一个大小无效(正常):0x12345678
  • free():无效指针:0x12345678
  • free():无效大小:0x12345678
  • malloc():损坏的未排序块:0x12345678
  • malloc():损坏的未排序块2:0x12345678
  • malloc():内存损坏:0x12345678
  • malloc():内存损坏(快速):0x12345678
  • malloc():smallbin双链接列表已损坏:0x12345678
  • munmap\u chunk():无效指针:0x12345678
  • realloc():下一个大小无效(快速):0x12345678
  • realloc():无效的旧大小(快速):0x12345678
  • realloc():无效指针:0x12345678
  • 损坏的双链接列表:0x12345678
调用
frobnite()
函数时会发生这种情况;该功能有什么问题?

回答示例问题 对示例问题给出了可接受的答案:

你的代码错了

您正在为单个指针(
malloc(sizeof(char*))
)分配空间,但没有字符。您正在用所有字符串覆盖分配的空间,导致未定义的行为(在这种情况下,会损坏
malloc()
的簿记数据)

您不需要为指针分配空间(
res
);这是一个局部变量。必须为要存储在指针所持地址的所有字符分配空间

由于要遍历列表以查找要连接的字符串,因此无法预先知道总大小。您必须在列表上进行两次传递:一次对每个字符串的
strlen()
求和,然后为分隔符和终止符分配该加上的空间,然后在实际执行串联时进行另一次传递

一般答案 您所看到的是glibc分配器内部结构损坏的结果。当您分配或释放动态内存时,分配器必须管理从操作系统保留的内存,并根据您请求的操作,找到要分发的新块,将释放的块排序到稍后可以再次分发的块列表中,或将内存返回操作系统。这些错误消息表明,它用于管理此功能的数据结构已损坏

这些错误都意味着您的一些代码修改了它没有使用的内存,调用了未定义的行为。这很可能是由于在程序中稍早的时候覆盖了一些内存造成的,并且完全可能错误不在
frobnite()
函数中

是的,这意味着错误可能出现在程序或使用的第三方库中的任何位置

对于堆栈溢出来说,这可能不是一个好问题。除非你有一个很好的简单复制你的问题,这个社区可能无法帮助你很多。错误的原因可能在代码中的任何地方(通常不在发现错误的函数中),也可能在我们看不到的代码中。堆栈溢出不是协作调试站点。即使有人能在你的代码中发现缺陷,你的特定问题也不可能对未来的访问者有所帮助

共同原因
  • 释放后使用。您已经释放/删除了一些内存,并在释放/删除后写入内存,覆盖了glibc记账所需的结构
  • Off-by-N错误。您正在将分配的块后的N个字节写入glibc内部用于记账的未分配内存中
  • 未初始化指针。您没有初始化指针。巧合的是,它指向glibc保留的一些内存,但不是由您的程序分配的,您可以对其进行写入
  • 分配了错误的空间量。这可能是因为您编写了
    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)
您现在需要做的是卷起袖子调试该问题

没有简单的答案来寻找什么,或者修复什么。没有你用错的单一句法结构。导致这种错误的原因有数千种

工具
  • 一种主要用于查找此类错误的工具。如果它找不到任何东西,请确保您使用的是最新版本,并且您也在尝试附带的
    exp sgc