释放一维数组内存的功能[重复]
Posted
技术标签:
【中文标题】释放一维数组内存的功能[重复]【英文标题】:function to free memory of 1D Array [duplicate] 【发布时间】:2014-06-30 05:56:18 【问题描述】:我是编程新手,但我不明白这一点。我应该创建一个以一维数组作为参数的函数,并释放这个数组。 我有这个:
void destroy(double A[])
free(A);
和我的主要:
void main()
swrmeg = (double *)malloc ((10)*sizeof(double));
swrmeg[0] = 3,2;
destroy(swrmeg);
printf("%lf\n",swrmeg[0]);
这应该给出分段错误,但它没有,它打印数组的第一个双精度。这意味着该数组尚未被释放。任何想法为什么会发生这种情况? 在函数中进行释放的任何正确方法?
【问题讨论】:
相关:how does free work? 【参考方案1】:您似乎被要求调查未定义行为 (UB)。 (这应该会导致分段错误)您所做的事情并不能保证会出现分段错误,但是您可以通过写入不属于您的地方来增加机会:
void main()
swrmeg = (double *)malloc ((10)*sizeof(double));
swrmeg[0] = 3,2;
destroy(swrmeg);
printf("%lf\n",swrmeg[0]);
void destroy(double *A)
int i;
for(i=0;i<3000;i++)//choose a looping index that will have higher likelyhood of encroaching on illegal memory
A[i] = i*2.0; //make assignments to places you have not allocated memory for
free(A);
关于使用空闲内存:This post 很好地描述了为什么空闲内存有时 工作。 (虽然,直接处理堆栈而不是堆内存,讨论的概念仍然说明使用一般的空闲内存)
【讨论】:
【参考方案2】:在执行未定义操作时无法保证段错误,它们只是在执行未定义操作时有时会发生。
在您的情况下实际发生的是内存已在malloc
中分配给您的程序,然后您的程序在free
语句中决定不需要它;但是,操作系统已决定不以导致段错误的方式移动其内存栅栏。
为什么不这样做有很多原因:
-
移动栅栏可能比让您的程序暂时摆脱一些额外字节的代价要高得多。
您可能会在几分钟后请求一些内存,如果您这样做(而且内存足够小),那么将返回相同的内存,而无需移动内存栅栏。
可能是在您达到某个硬件相关限制(如整页内存)之前,操作系统无法重置内存栅栏。
可能是...
这就是它未定义的原因,因为它基本上依赖于太多的东西,所有的实现都不需要对齐。需要对齐的是定义的部分。
【讨论】:
谢谢 edwin,非常有帮助 :)【参考方案3】:你正确地释放了它。
做错事,比如在内存被释放后访问它,并不一定意味着你会遇到分段错误,就像在错误的道路上行驶意味着你一定会出事的。
【讨论】:
你是对的..但是如何在我释放数组之后打印数字?我的意思是,如果存储在数组中的数字仍然存在,那么释放的意义何在? @fets 通过释放,您告诉操作系统从现在开始它可以(不是必须)将其他东西放入该内存位置。如果它当时没有任何东西可以放在那里,它会留下里面的东西不受影响。阅读我粘贴在您问题评论部分的相关链接,了解在其他情况下会发生什么。 谢谢你们,你们让我明白了.. :)以上是关于释放一维数组内存的功能[重复]的主要内容,如果未能解决你的问题,请参考以下文章