【问题标题】:double free or corruption (fasttop) error双重免费或损坏(fasttop)错误
【发布时间】:2014-12-04 05:54:58
【问题描述】:

所以我正在使用一个可调整大小的数组来实现一个堆,每次它重新分配内存时我都会收到这个错误。问题在于 realloc ..我只是不知道它有什么问题。这是插入函数:

void* insert (data_t *data, int room, long wake) {
 if(data->size+1 == data->arraySize){
    data->arraySize *= 2;
    long l = (long)data->arraySize;
    int* tempOne = realloc(data->heapElemOne, data->arraySize*sizeof(int));

    long* tempTwo = realloc(data->heapElemTwo, l*sizeof(long));

    if ( tempOne != NULL &&tempTwo !=NULL){ //realloc was
        data->heapElemOne = tempOne;
        data->heapElemTwo = tempTwo;
    }
    else{ //there was an error
        printf("Error allocating memory!\n");
        free(data->heapElemOne);
        free(data->heapElemTwo);
        return;
    }

  }
  data->size++;
  int now = data->size;

  /*Adjust its position*/
  if(data->size >0){

    while(data->heapElemTwo[now/2] > wake && ((now/2)!=0))
    {
            data->heapElemTwo[now] = data->heapElemTwo[now/2];
            data->heapElemOne[now] = data->heapElemOne[now/2];
            now /= 2;
    }
  }

  data->heapElemTwo[now] = wake;
  data->heapElemOne[now] = room;`

这是主要的一部分:

int main(int argc, char *argv[]){
    pthread_t r, c;
    data_t data;
    data.arraySize = 2;
    data.size = 0;
    long l = (long)data.arraySize;
    data.heapElemOne = malloc(data.arraySize * sizeof(int));
    data.heapElemTwo = malloc(l * sizeof(long));

这是 data_t 声明:

typedef struct{
    int arraySize;
    int* heapElemOne;
    long* heapElemTwo;
    int size;
    int number;
    pthread_mutex_t mutex;
    pthread_cond_t more;
}data_t;

它将内存重新定位为 4,但是当它更改为 8 时会出错。搞了这么多年还是想不通-_- 提前致谢!

【问题讨论】:

  • 无法弄清楚您实际需要什么。
  • 可能是在每次调用malloc()realloc() 时,您都希望将要分配的元素数乘以sizeof( int )sizeof( long ),具体取决于您存储的数据类型?
  • 张贴data_t的声明。听起来您有 pointerint 参考问题。
  • 已更新 data_t 声明 :)

标签: c


【解决方案1】:
malloc(data.arraySize)

mallocrealloc 的所有其他调用都是错误的。你想要的

malloc(data.arraySize * sizeof(int)) 

或者,分别,

malloc(data.arraySize * sizeof(long)) 

根据您的元素类型。 malloc 和朋友接受以字节为单位的分配大小,ints 和 longs 通常大于一个字节。所以你的数组分配得太短了,你会遇到缓冲区溢出。

【讨论】:

  • 你是说因为我给了它 2 号它不工作吗?已经添加 *sizeof(int) 并且很久以前,仍然不起作用:/
  • 请不要进行散弹枪编程。 malloc(data.arraySize) 是错误的,以防万一,尝试它是没有意义的。请正确调用malloc 和朋友来更新您的代码。如果问题仍然存在,请发布 MCVE,而不是在此处发布一段代码,在此处发布另一段代码。
  • 谢谢,当我添加一个清理功能时,我实际上得到了它的工作......不知道如何:/但不要认为它会与我使用 malloc 和 realloc 的方式一起工作,所以谢谢! :)
【解决方案2】:

几乎可以肯定,realloc 不是问题所在,realloc 已经在各种情况下进行了测试,并且证明是可靠的。检查您的代码是否没有超出任何其他已分配结构的数组的边界..

您可能超出了分配的上限。 realloc 分配字符,但是,您的数组是整数,几乎可以肯定比字符大

尝试以下更改: . int* tempOne = realloc(data->heapElemOne * sieof(int), data->arraySize); long* tempTwo = realloc(data->heapElemTwo, sizeof(long));

【讨论】:

  • 我以为我可能使用了 realloc 错误之类的。我尝试了这些更改,但没有用:(
【解决方案3】:

很酷,我想通了。我不知道如何,但由于某种原因,当我为我的线程添加清理功能时,当收到 sigint 时错误消失了:/ 我是 c.. 的新手。只用了几天,所以我不知道清理是如何修复它的:/ 不过感谢您的帮助:) 我最初使用 malloc 和 realloc 的方式也是错误的,所以也感谢 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 2014-06-25
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    相关资源
    最近更新 更多