用于释放1D阵列的内存

时间:2014-05-12 18:36:30

标签: c arrays free

我是编程的新手,我只是不明白这一点。我应该创建一个以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]);
}

这应该会给出一个分段错误,但它没有,它会打印出数组的第一个双精度错误。这意味着阵列尚未被释放..任何想法为什么会发生这种情况? 有什么方法可以在函数中释放吗?

3 个答案:

答案 0 :(得分:2)

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

在您的案例中实际发生的事情是已在[{1}}中为您的程序分配了内存,然后您的程序已确定它在malloc语句中不需要它;但是,操作系统决定不以这种方式移动它的内存栅栏,导致段错误。

为什么它没有这样做包括很多原因:

  1. 移动围栏可能要贵得多,而不仅仅是为了让你的程序在一段时间内有一些额外的字节而离开。
  2. 可能是你在几分钟内要求一些记忆,如果你这样做(并且它足够小)那么将返回相同的记忆,而不需要移动记忆围栏
  3. 可能是在您达到某些硬件相关限制(如整页内存)之前,操作系统无法重置内存栅栏。
  4. 可能是......
  5. 这就是它未定义的原因,因为它基本上依赖于所有实现不需要对齐的许多事情。 定义的部分需要对齐。

答案 1 :(得分:2)

你正确地解放了它。

做错事,比如在被释放后访问一块内存,必然意味着你会遇到分段错误,不仅仅是在道路的错误方面行驶意味着你一定会发生意外。

答案 2 :(得分: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);
}  

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