【问题标题】:Realloc resizing arrayRealloc 调整数组大小
【发布时间】:2017-08-24 13:31:48
【问题描述】:

我对在 C++ 中使用 realloc() 函数有疑问。我需要它通过删除第一项来基本上改变数组的大小。这就是我所做的

cell* Queue::pull() {
    cell* data = cellArray[0];
    arrayLen--;
    cell** temp = (cell**)realloc(cellArray+1, sizeof(cell*)* (arrayLen));
    if (temp == NULL) {
        return 0;
    }
    cellArray = temp;
    return data;
}

arrayLen 是整数,它存储队列的当前长度,而 cellArray 是一个预先分配和填充的 cell* 数组。

cell** cellArray;
int arrayLen = 0;

我的问题是:这会导致内存泄漏吗? realloc 是否释放了数组的第一项使用的空间,或者这与以下内容基本相同:

cell** temp = cellArray+1;

提前谢谢你。

【问题讨论】:

  • 传递给realloc 的任何指针不是C 分配函数之一的返回值是未定义的。 cellArray+1 不是这样的指针。
  • “C++ 中的 realloc() 函数” 呃……你为什么在 C++ 中使用realloc??
  • 如果你曾经在那个东西中存储了一个带有构造函数/析构函数的 C++ 对象并通过realloc 处理它,那么所有的地狱都会崩溃。不要这样做。
  • 只需使用std::vector 并忘记reallocmallocfree 的存在。对于动态分配,甚至忘记 newdelete 存在 99% 的时间,只需使用 std::make_uniquestd::make_shared

标签: c++ arrays memory-leaks realloc


【解决方案1】:

如果分配的内存被扩展,以下情况为真:

  • 如果当前内存段在内存空间之后需要,那么直接扩展这个内存空间,realloc ()会回到原来的指针。
  • 如果当前内存段后面的空闲字节不够,那么使用第一个内存块来满足这个要求,将当前数据复制到新的位置,并释放原来的数据块,返回一个新的内存块位置。
  • 如果申请失败,会返回NULL,这一次,原来的指针依然有效。

并且你要注意:如果调用成功,不管当前内存空间后面的空闲空间是否满足要求,都会释放原指针,返回一个指针,虽然返回的指针和原指针一样一样,就是不能再释放原来的指针了

【讨论】:

    猜你喜欢
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 2020-01-12
    • 2011-11-10
    相关资源
    最近更新 更多