【问题标题】:allocated memory after reasignment of pointer重新分配指针后分配的内存
【发布时间】:2016-08-13 10:36:31
【问题描述】:

我有两个指针:

1.

double *a, *b;
a = (double *) malloc (N*sizeof (double));
b = (double *) malloc (N*sizeof (double));

指向我使用malloc 分配的巨大内存空间。并赋值。

如果我这样做了,

a=b;

a 指向数组 b 指向。

分配给 a 的内存会怎样?正在遵循更好的选择:

free(a);
a=b;
free(b);

或只有

a=b;
free(b);

或 a=b; 免费(一);

还是违法?

  1. 如果 a 是全局的,b 是局部的,会有什么不同吗?

【问题讨论】:

  • 请不要双重标记 C 和 C++
  • “分配给 a 的内存会发生什么变化?” 它泄漏了。
  • 抱歉打错了。更正
  • I know there are std::vectors that make things easier. 在 C 中没有 std::vector
  • @πάνταῥεῖ 避免泄漏的最佳方法是什么。我的意思是哪个免费更好?

标签: c arrays pointers memory


【解决方案1】:
  1. 在您的示例中,a=b 创建了一个内存泄漏。先前由a 指向的内存块变得无法释放,因为您的程序不再有指向它的指针。这可能不会立即导致问题,但随着时间的推移,您的程序会耗尽内存,mallocs 开始返回 NULL

  2. 在重新分配之前调用 free(a) 可以解决此问题。一旦分配了a=b,在调用free(b) 之后使用a 时需要小心,因为a 会变成一个悬空指针

如果a 是全局的而b 是本地的,会有什么不同吗?

指针的范围在这里无关紧要。必须独立于指针指向的内存块来考虑指针。该块在动态内存中分配;指向块的指针可以是任何地方——静态的、自动的或动态的。

【讨论】:

    【解决方案2】:

    您正在做的事情会导致您为a 分配的内存泄漏。这意味着您丢失了存储在内存中的信息,因为您用b 覆盖了指针。如果你想像你一样分配指针,你自己提出的解决方案

    free(a);
    a=b;
    free(b);
    

    会起作用的。但请记住,在释放b 之后,a 指向一个无效位置,因为您释放了内存。所以访问a[0]会使程序崩溃。

    【讨论】:

      【解决方案3】:

      当您执行a=b 时,a 指向b 所指向的数组。然后,您想要释放的唯一内存是最初由a 指向的数组。为此,

      free(a);
      a=b;
      

      在这里,您正在释放a 指向的内存,并使a 指向b 指向的内存。如果您首先执行a=b,则您有a 指向b 指向的数组,但无法访问之前a 指向的内存。所以,你应该先释放a。此外,如果您稍后释放b,那么您将只剩下ab 都指向NULL。

      【讨论】:

        猜你喜欢
        • 2022-09-24
        • 1970-01-01
        • 2015-07-14
        • 1970-01-01
        • 2021-06-22
        • 2015-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多