首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重新分配指针后分配的内存

问重新分配指针后分配的内存
EN

Stack Overflow用户
提问于 2016-08-13 10:36:31
回答 3查看 45关注 0票数 1

我有两个建议:

1.

代码语言:javascript
复制
double *a, *b;
a = (double *) malloc (N*sizeof (double));
b = (double *) malloc (N*sizeof (double));

这意味着我使用malloc分配的内存空间很大。并分配价值。

如果我这么做了

代码语言:javascript
复制
a=b;

a指向b所指向的数组。

分配给a的内存发生了什么变化?正在采取更好的替代办法:

代码语言:javascript
复制
free(a);
a=b;
free(b);

或者只是

代码语言:javascript
复制
a=b;
free(b);

或a=b;免费(A);

还是不合法?

  1. 如果a是全局的,b是本地的,情况会有所不同吗?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-13 10:42:23

  1. 在您的示例中,a=b会创建一个内存泄漏。a以前指出的内存块不可能释放,因为您的程序不再有指向它的指针。这可能不会导致立即出现问题,但随着时间的推移,您的程序将耗尽内存,malloc的NULL开始返回。
  2. 在重新分配之前调用free(a)解决了这个问题。一旦分配了a=b,就需要在调用free(b)之后小心使用a,因为a成为一个悬空的指针。

如果a是全局的,而b是本地的,这是不同的吗?

指针的范围在这里并不重要。指针必须独立于指针所指向的内存块来考虑。块在动态内存中分配;指向块的指针可以是任何地方--静态、自动或动态。

票数 1
EN

Stack Overflow用户

发布于 2016-08-13 10:42:13

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

代码语言:javascript
复制
free(a);
a=b;
free(b);

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

票数 1
EN

Stack Overflow用户

发布于 2016-08-13 10:44:19

执行a=b时,a指向b指向的数组。然后,您希望释放的唯一内存是a最初指向的数组。因为那样做,

代码语言:javascript
复制
free(a);
a=b;

在这里,您正在释放a指向的内存,并使a指向由b指向的内存。如果首先执行a=b,则a指向b指向的数组,但无法访问a先前指向的内存。因此,您应该首先释放a。此外,如果稍后释放b,则只剩下a和b都指向NULL。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38931817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档