释放一维数组内存的功能[重复]

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 通过释放,您告诉操作系统从现在开始它可以(不是必须)将其他东西放入该内存位置。如果它当时没有任何东西可以放在那里,它会留下里面的东西不受影响。阅读我粘贴在您问题评论部分的相关链接,了解在其他情况下会发生什么。 谢谢你们,你们让我明白了.. :)

以上是关于释放一维数组内存的功能[重复]的主要内容,如果未能解决你的问题,请参考以下文章

一维数组和面向对象基础知识

C++如何用new动态开辟一个一维字符数组

CUDA 一维数组未更新

c语言中怎样实现对二维数组元素进行赋值并输出。

php中一维或多维数组去除重复项

在excel中如何得到一维内存数组