【问题标题】: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]);
}

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

【问题讨论】:

标签: c arrays free


【解决方案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 语句中决定不需要它;但是,操作系统已决定不以导致段错误的方式移动其内存栅栏。

    为什么不这样做有很多原因:

    1. 移动栅栏可能比让您的程序暂时摆脱一些额外字节的代价要高得多。
    2. 您可能会在几分钟后请求一些内存,如果您这样做(而且内存足够小),那么将返回相同的内存,而无需移动内存栅栏。
    3. 可能是在您达到某个硬件相关限制(如整页内存)之前,操作系统无法重置内存栅栏。
    4. 可能是...

    这就是它未定义的原因,因为它基本上依赖于太多的东西,所有的实现都不需要对齐。需要对齐的是定义的部分。

    【讨论】:

    • 谢谢 edwin,非常有帮助 :)
    【解决方案3】:

    你正确地释放了它。

    做错事,比如在内存被释放后访问它,并不一定意味着你会遇到分段错误,就像在错误的道路上行驶意味着你一定会出事的。

    【讨论】:

    • 你是对的..但是如何在我释放数组之后打印数字?我的意思是,如果存储在数组中的数字仍然存在,那么释放的意义何在?
    • @fets 通过释放,您告诉操作系统从现在开始它可以(不是必须)将其他东西放入该内存位置。如果它当时没有任何东西可以放在那里,它会留下里面的东西不受影响。阅读我粘贴在您问题评论部分的相关链接,了解在其他情况下会发生什么。
    • 谢谢你们,你们让我明白了.. :)
    猜你喜欢
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 2016-03-15
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多