比如我用new函数分配了若干内存空间,到最后要用delete函数来释放,否则就叫内存泄露了。 但是据我所知,delete函数释放内存无非就是把那段内存里所储存的数据清空而已啊。 那么我就算不用delete函数清空,就让数据在那段内存里,我要再用那段内存的时候只需要对其重新赋值就可以了啊,怎么会存在内存找不回来的情况呢?
我表达能力不太强,举个例子说比如我用new申请的地址为10000内存里存有数字10,最后我就算不用delete,就让10在里面,然后下次我又用到了10000这个地址,我可以直接对其赋值100,这样10不就被100替换了吗,为什么书上说这样叫内存泄露,找不回来了啊? 根据我的理解除非这个地址不用delete释放的话,new函数或者功能相同的函数或者定义指针变量再也申请不到地址为10000这块内存,这样这块内存才是真正泄露了。
请懂的大哥告诉迷惘的小弟啊!
10 个解决方案
内存释放绝对不是清空。
内存泄露是没有释放内存。
int* p = new int; //分配 内存11
// delete p; //释放1 必须得,否则会丢失内存1
p = new int; // 指向内存2
delete p; //释放2 同理
可以认为,只要那段内存你保留着,依然还有使用价值,就可以不认为是内存泄漏
当然前提是你还能找回那段内存,还继续使用,简单的说,就是在你的程序结束之前,那段内存一直有使用价值
若你new了之后又不delete,然后那段内存一直空放着不用直到程序结束,那段时间就可以说是内存泄漏了
个人理解,入门级菜鸟路过。
内存泄漏是指当你用new 申请内存,在你不需要这个内存时你没有释放,并且你没有发现或者你指内存指针弄丢了,这就是所所谓的内存泄漏。如果一某个方法里有内存泄漏并且反复调用这个方法则应用的剩余内存就会越一越少。当然如果你是有目地的没有释放而且留着下次在用也不算泄漏,只要是在你能控制的范围内就可以不算是泄漏,呵呵。
现在的32位 windows下内存泄漏是有范围的,一个应用的内存泄漏不会影响其它应用或是操作系统,并且在应用关闭时所内存均会被释放。
int main()
{
char *p;
while(1)
p = malloc(1000000);
return 0;
}
编译运行感受一下就好了
内存泄漏这样的问题一般是服务器程序才会比较在乎,因为它们长时间运作,可能就逐渐把内存吃光了
只能这么说,楼主好好找本《操作系统》书来看看。
或者google下,系统是怎么new内存给你的,怎么delete内存的。
new 之后是操作系统帮你管理,不delete ,操作系统始终认为该内存被占用。
所谓delete 并不是清空数据,而是将所用到的内存还给操作系统进行管理。如果不delete的话,操作系统仍然认为你在使用这段内存,实际上你的程序已经使用完毕,那么就会导致内存的“遗失”。