我有两个建议:
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;免费(A);
还是不合法?
发布于 2016-08-13 10:42:23
a=b会创建一个内存泄漏。a以前指出的内存块不可能释放,因为您的程序不再有指向它的指针。这可能不会导致立即出现问题,但随着时间的推移,您的程序将耗尽内存,malloc的NULL开始返回。free(a)解决了这个问题。一旦分配了a=b,就需要在调用free(b)之后小心使用a,因为a成为一个悬空的指针。如果
a是全局的,而b是本地的,这是不同的吗?
指针的范围在这里并不重要。指针必须独立于指针所指向的内存块来考虑。块在动态内存中分配;指向块的指针可以是任何地方--静态、自动或动态。
发布于 2016-08-13 10:42:13
您正在做的事情会导致您分配给a的内存泄漏。这意味着您丢失了存储在内存中的信息,因为您用b覆盖指针。如果您想像您所做的那样分配指针,那么您自己提出的解决方案
free(a);
a=b;
free(b);会起作用的。但是请记住,在释放b之后,a指向一个无效的位置,因为您释放了内存。所以访问a[0]会使程序崩溃。
发布于 2016-08-13 10:44:19
执行a=b时,a指向b指向的数组。然后,您希望释放的唯一内存是a最初指向的数组。因为那样做,
free(a);
a=b;在这里,您正在释放a指向的内存,并使a指向由b指向的内存。如果首先执行a=b,则a指向b指向的数组,但无法访问a先前指向的内存。因此,您应该首先释放a。此外,如果稍后释放b,则只剩下a和b都指向NULL。
https://stackoverflow.com/questions/38931817
复制相似问题