2014-05-12 78 views
1

我是编程新手,我只是不明白这一点。我应该做一个函数,它将1d数组作为参数,并释放这个数组。 我有这样的:函数释放一维数组的内存

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]); 
} 

这应该给分段错误,但事实并非如此,它打印阵列的第一双。这意味着数组还没有被释放。任何想法为什么会发生这种情况? 任何正确的方法来释放一个函数?

+1

相关:[如何自由工作?](http://stackoverflow.com/a/1119334/1670308) – streppel

回答

2

执行未定义的操作时,无法保证Segfaults,它们有时会在执行未定义的操作时发生。

你的情况实际发生的是内存已分配给你的程序在malloc然后你的程序已经决定它不需要它在free声明;然而,操作系统已决定不移动它的内存区域以引起段错误。

为什么不能这样做包含了很多方面的原因:

  1. 它可能是更昂贵的移动栅栏,而不是只为了让你的程序具有了一些额外的字节脱身一会儿。
  2. 这可能是因为你会在几分钟内询问一些内存,如果你这样做(并且它足够小),那么将返回相同的内存,而不需要移动内存隔离。
  3. 它可能是,直到你达到一些硬件相关的限制(如一整页的内存)操作系统无法重置内存围栏。
  4. 这可能是...

这就是为什么它是不确定的,因为它基本上是依赖于所有的实现并不需要对齐这么多东西。它是定义的部分,需要对齐。

+0

谢谢埃德温,非常帮助的东西:) – fets

2

您正确释放它。

做错了什么,比如在它被释放后访问一块内存,并不是必然意味着你会得到一个分段错误,不仅仅是在错误的一边驾驶意味着你一定会发生事故。

+0

你是对的..但是如何打印数字后,我释放数组?我的意思是,如果存储在数组中的数字仍然存在,那么释放的点是什么? – fets

+1

@fets释放,你告诉操作系统,它可以*(不*必须*)从现在开始将其他东西放在该内存位置。如果当时没有任何东西放在那里,它就会留下未被触及的东西。请阅读我在问题评论部分粘贴的相关链接,以了解其他情况下会发生的情况。 – streppel

+0

谢谢你们,你们明白了我的意思.. :) – fets

0

看起来你被要求调查未定义的行为(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); 
} 

使用关于free'd内存This post是一个很好的描述,为什么free'd内存将有时工作。(尽管直接处理堆栈而不是堆内存,所讨论的概念仍然是关于通常使用free'd内存的说明)