分配给 for 的指针:我应该释放它吗?

Pointer allocated in for: should I have to free it?

假设我有这个代码:

for (int i=0;i<n;i++) {
  //compute z
  float *p = (float *) malloc (sizeof(float)*z);
  //do something with p
}

请注意,p 未在其他任何地方使用,并且每个 for 循环彼此独立。

假设z 不是那么大,那么 p 就内存而言并没有那么昂贵。但是,n可能很大,所以p占用的总内存可以保持一致。

free() 是否正确:

for (int i=0;i<n;i++) {
  //compute z
  float *p = (float *) malloc (sizeof(float)*z);
  //do something with p
  free(p);
}

奖金问题: 如果时间性能是优先考虑的(而不是内存消耗),最好避免 free(p),因为它很耗时?

您可以在循环之前预先分配必要的内存量并重新使用它。

如果您不知道 z 有多大 - 我建议在某处写下已分配内存的大小,如果 z 大于它 - 然后重新分配,否则 - 只需重新使用已分配的内存。

是的。你必须 free 它。否则你会发生内存泄漏,这很糟糕。特别是如果你循环很多次。

一个好的经验法则是每个 malloc 必须与 free 匹配。总是。 (这对大型项目尤为重要)

既然你用 C++ 标记了它,你就不应该使用 mallocfree。使用 smart pointers (或 new/delete 如果您无法访问 C++11 兼容的编译器).

for (int i=0;i<n;i++) {
  // compute z
  std::unique_ptr<float[]> p{new float[z]};
  // do something with p
  // p gets automatically freed at the end of the scope
}

回答您的问题:

Is it correct to free() it with...

是的。如果你用 malloc 分配一些东西,你总是需要 free 它。

would be better to avoid the free(p), since it's time consuming?

是的。考虑在循环外预分配内存位置。

// preallocate
std::unique_ptr<float[]> p{new float[z]};

for (int i=0;i<n;i++) {
  // clear p
  // compute z
  // do something with p
}

// p gets automatically freed at the end of the scope

观察:malloc被使用。行动:调用 free。就这么简单。可移植的、定义明确的代码需要 malloc free.

分配的内存量在这里不起作用。如果内存太多,malloc 将引发错误,但这与您始终需要 free 跟随 malloc.

的事实无关。

考虑使用可重复使用的缓冲区以避免不必要的分配。这可以很容易地通过使用 std::vector<float>:

来完成
std::vector<float> p;
for (int i=0;i<n;i++) {
    //compute z
    p.resize( z );
    //do something with p
}

在最坏的情况下,您会得到 O(log n) 内存分配。使用您的代码,您将获得 n 内存分配。不调用 free() 只会导致内存泄漏。 std::vector<float>最终会自动清理内存。

看起来大小是恒定的,为什么要一次又一次分配呢? 只需在循环之前分配一次,在循环内部初始化。 您可以重复使用内存。并在循环结束后释放内存。

并且程序在循环后结束那么你不必释放它,程序消耗的所有堆内存都会返回给OS,但释放总是一个好习惯你分配的内存。 关于bonus的问题,free没那么耗时,分配内存就是,所以不用担心free耗的时间。

如果您再次重用该内存 - 显然只有在您结束程序时才释放它并且只分配一次(并在需要 bigger/smaller 数组时使用 realloc() 重新分配)效率更高.

您可能会编程的每个 OS 都将在您的程序终止时处理释放动态分配的内存。但是,由于我们主要尝试使我们的代码尽可能跨平台,因此您应该始终 free() 动态分配内存。

至于如果你有大量的内存并且只关心速度 - 那么显然 free()ing 会 'slow down' 程序,但是它花费的时间少得离谱, 76*(10**-8) 在我简陋的机器上,对于 1024 字节的块,所以它是相当微不足道的。