动态分配的内存回收问题

时间:2022-06-23 22:06:07
在链表中通过malloc(new)动态分配的内存(在create和insert操作中)没有被free(delete)光(在delete操作中),那么这部分内存,系统会不会自动回收?
另外用vector容器,当程序异常退出,那么由于vector没能调用他的祈构函数(同理与其他因异常退出而没能调用祈构函数来释放动态分配的内存),分配在vector中的内存,系统会不会自动回收??

16 个解决方案

#1


在链表中通过malloc(new)动态分配的内存(在create和insert操作中)没有被free(delete)光(在delete操作中),那么这部分内存,系统会不会自动回收?
不会。
另外用vector容器,当程序异常退出,那么由于vector没能调用他的祈构函数(同理与其他因异常退出而没能调用祈构函数来释放动态分配的内存),分配在vector中的内存,系统会不会自动回收??
好像也不会吧。

#2


1.不会。
2.不会。(是题目不会)

#3


要是系统会自动回收,就不用担心内存泄漏的问题了~~可惜操作系统没这么聪明,所以还是事事小心的说!

#4


又不是java,所以没有垃圾回收机制,这是经过长时间的权衡利弊,做出的决定,详细情况请见 c++ D&E

#5


我不是这个意思。
我们都编过链表之类的程序,所以我想问的是我们通过create和insert函数插入了许多的数据,可是总不至于在delete中把那些数据统统delete光把,总会剩下一些数据。我说的是剩下的那部分数据的内存!!

#6


如果你自己不处理,不要指望系统会帮你擦屁股:)

#7


当然要delete光,有多少new就有多少delete,不是new的不用delete。

#8


只要是new出来的,都把它delete光光。剩下的数据就是栈里的,管他作甚。

#9


link *p,*q;
{
...
...
}

while(p->next!=NULL)
{
   q=p->next;
    delete p;
}
delete q;
这样应该可以了。

#10


这样是不会自动delete的

你可以设计类把delete设计在
析构函数
可以自动调用 不过你点设计好
不然也会 造成内存泄漏的

#11


1. 在链表中通过malloc(new)动态分配的内存(在create和insert操作中)没有被free(delete)光(在delete操作中),那么这部分内存,系统会不会自动回收?

【答】
不会。
你必须清楚一点:C 是非“自动化”的语言,不像 JAVA,DELPHI 可以自动替程序员完成许多工作,C 程序的命运可以用“事必躬亲”来形容,C++ 只比 C 略好那么一点而已
你亲自分配的内存,就必须自己亲自释放
就好比电影里常有的,你把女方肚子弄大了,就应该为后果负责……


2. 另外用vector容器,当程序异常退出,那么由于vector没能调用他的祈构函数(同理与其他因异常退出而没能调用祈构函数来释放动态分配的内存),分配在vector中的内存,系统会不会自动回收??

【答】
可能不会。
不同的系统有不同的资源管理方案(STL 是独立于 OS 的)
所谓程序的“异常”结束,也有各种不同的具体情况:
1. 野蛮的“异常”退出,一条跳转语句,直接跳到程序的出口处
2. 文明的“异常”退出,系统会自动替被强制结束的进程释放资源,当然也包括 vector 的内存

但是,作为一个正常的程序,你不能指望系统替你做你应该做的事,那些措施的作用只是以防万一

#12


http://www.c-view.org/journal/001/001.htm
请看第一期《c-view》上面的smart pointer.

#13


哇,经过一番推敲,我也基本上明白了。
呵呵,灯会结帐!!

#14


new和delete是孖生的,一定要一一对应,要不是问题多多.

#15


如果你只是通过new 或malloc创建的内存,那么你的进程退出后,系统会自动回收。所谓的内存泄漏是指你的程序没有退出,你malloc或new的内存不用时不去释放造成系统内存浪费

#16


老猫的话是正确.

只要你的进程最后是退出了,就不存在内存泄漏了.OS会把你的内存资源全部回收的.

但对一个需要长时间运行或是无限期运行的程序来说,new/delete配对就十分重要了.否则程序要宕的.

同时,我认为new/delete配对是书写良好程序的规范,尽量遵守的好!

#1


在链表中通过malloc(new)动态分配的内存(在create和insert操作中)没有被free(delete)光(在delete操作中),那么这部分内存,系统会不会自动回收?
不会。
另外用vector容器,当程序异常退出,那么由于vector没能调用他的祈构函数(同理与其他因异常退出而没能调用祈构函数来释放动态分配的内存),分配在vector中的内存,系统会不会自动回收??
好像也不会吧。

#2


1.不会。
2.不会。(是题目不会)

#3


要是系统会自动回收,就不用担心内存泄漏的问题了~~可惜操作系统没这么聪明,所以还是事事小心的说!

#4


又不是java,所以没有垃圾回收机制,这是经过长时间的权衡利弊,做出的决定,详细情况请见 c++ D&E

#5


我不是这个意思。
我们都编过链表之类的程序,所以我想问的是我们通过create和insert函数插入了许多的数据,可是总不至于在delete中把那些数据统统delete光把,总会剩下一些数据。我说的是剩下的那部分数据的内存!!

#6


如果你自己不处理,不要指望系统会帮你擦屁股:)

#7


当然要delete光,有多少new就有多少delete,不是new的不用delete。

#8


只要是new出来的,都把它delete光光。剩下的数据就是栈里的,管他作甚。

#9


link *p,*q;
{
...
...
}

while(p->next!=NULL)
{
   q=p->next;
    delete p;
}
delete q;
这样应该可以了。

#10


这样是不会自动delete的

你可以设计类把delete设计在
析构函数
可以自动调用 不过你点设计好
不然也会 造成内存泄漏的

#11


1. 在链表中通过malloc(new)动态分配的内存(在create和insert操作中)没有被free(delete)光(在delete操作中),那么这部分内存,系统会不会自动回收?

【答】
不会。
你必须清楚一点:C 是非“自动化”的语言,不像 JAVA,DELPHI 可以自动替程序员完成许多工作,C 程序的命运可以用“事必躬亲”来形容,C++ 只比 C 略好那么一点而已
你亲自分配的内存,就必须自己亲自释放
就好比电影里常有的,你把女方肚子弄大了,就应该为后果负责……


2. 另外用vector容器,当程序异常退出,那么由于vector没能调用他的祈构函数(同理与其他因异常退出而没能调用祈构函数来释放动态分配的内存),分配在vector中的内存,系统会不会自动回收??

【答】
可能不会。
不同的系统有不同的资源管理方案(STL 是独立于 OS 的)
所谓程序的“异常”结束,也有各种不同的具体情况:
1. 野蛮的“异常”退出,一条跳转语句,直接跳到程序的出口处
2. 文明的“异常”退出,系统会自动替被强制结束的进程释放资源,当然也包括 vector 的内存

但是,作为一个正常的程序,你不能指望系统替你做你应该做的事,那些措施的作用只是以防万一

#12


http://www.c-view.org/journal/001/001.htm
请看第一期《c-view》上面的smart pointer.

#13


哇,经过一番推敲,我也基本上明白了。
呵呵,灯会结帐!!

#14


new和delete是孖生的,一定要一一对应,要不是问题多多.

#15


如果你只是通过new 或malloc创建的内存,那么你的进程退出后,系统会自动回收。所谓的内存泄漏是指你的程序没有退出,你malloc或new的内存不用时不去释放造成系统内存浪费

#16


老猫的话是正确.

只要你的进程最后是退出了,就不存在内存泄漏了.OS会把你的内存资源全部回收的.

但对一个需要长时间运行或是无限期运行的程序来说,new/delete配对就十分重要了.否则程序要宕的.

同时,我认为new/delete配对是书写良好程序的规范,尽量遵守的好!