分配的指针用于:我是否必须释放它?

时间:2016-12-06 09:45:15

标签: c memory malloc free

假设我有这段代码:

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

请注意,p并未在其他地方使用,每个for周期都与其他周期无关。

我们假设z不是那么大,所以 p在memmory方面并不昂贵。但是,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),因为它耗费时间?

7 个答案:

答案 0 :(得分:4)

由于您使用 C ++ 对其进行了标记,因此不应使用mallocfree。如果您无权访问符合C ++ 11的编译器,请使用smart pointers (或new / delete

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
}

回答您的问题:

  

用...来释放它是否正确

是。如果您使用malloc分配内容,则始终需要free

  

最好避免免费(p),因为这很费时间?

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

// 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

答案 1 :(得分:3)

您可以在循环之前预先分配必要的记忆金额并重复使用。

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

答案 2 :(得分:2)

观察:使用free。行动:调用malloc。它就这么简单。便携式,定义明确的代码需要free malloc

分配的内存量在此处不起作用。如果内存太多,free会抛出错误,但这与您始终需要malloc关注 public ArrayList<Double> lat = new ArrayList<Double>(); public int l = lat.size(); public ArrayList<Double> lng = new ArrayList<Double>(); public int ll = lng.size(); ListIterator latIt = lat.listIterator(l); ListIterator longIt = lng.listIterator(ll); while(latIt.hasPrevious()) { System.out.println(latIt.previous()); } while(longIt.hasPrevious()) { System.out.println(longIt.previous()); } 这一事实无关。

答案 3 :(得分:0)

是。你必须free它。否则你有内存泄漏,这是不好的。特别是如果你循环很多次。

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

答案 4 :(得分:0)

考虑使用缓冲区,重用该缓冲区以避免不必要的分配。使用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>最终会自动清理内存。

答案 5 :(得分:0)

看起来大小是不变的,所以为什么要一次又一次地分配呢? 只需在循环之前分配一次,在循环开始时初始化。 您可以重用内存。循环结束后释放内存。

程序在循环之后结束然后你不必释放它,程序消耗的所有堆内存都将返回到操作系统,但释放你分配的内存总是一个好习惯。 关于奖金问题,免费并不耗费时间,但分配内存是,所以不要担心免费消耗的时间。

答案 6 :(得分:0)

如果再次重用该内存 - 只有当你结束程序并且只分配一次时(并且当你需要更大/更小的数组时使用realloc()重新分配),释放它显然更有效。

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

至于你是否拥有大量内存并且只关心速度 - 那么显然free()会“减慢”程序的速度,但是它花费的时间非常小,{{1在我不起眼的机器上,对于一个1024字节的块,所以它是相当微不足道的。