动态分配的内存释放问题

时间:2022-05-15 02:26:48
最近看到了一些帖子对malloc和new等函数分配的内存在程序结束后是否会自对释放内存进行讨论。有几点想请教下:
1、这些函数分配的内存在整个程序退出后动态分配的内存是否会被系统自动回收?
2、如果自动回收跟语言的回收机制有关系还是跟操作系统的回收机制有关系?
3、哪些语言或平台会在对内存进行监管在程序退出时主动回收内存?
虽然malloc与free配对出现是个良好的习惯,不过我还是想详细地了解下动态内存回收这方面的知识,希望有牛人能解答一下上面的几个问题。

17 个解决方案

#1


好像是操作系统在进程结束之后会有对进程所用资源进行回收。

#2


该回复于2011-11-28 13:27:04被版主删除

#3


程序执行结束后,malloc申请的空间,系统会释放它们。这是系统对该程序的所有资源进行的回收。

#4


程序结素后,系统会释放进程.进程内所有资源都被释放.所以内存也被回收.
语言的回收机制,如JAVA等,是在该资源用完后自动回收,并不一定是在程序结束后.

#5


1、这个两个函数分配的都是在堆中分配的空间,要程序自己释放的,操作系统不会回收的。
2、这个问题,我感觉跟操作系统也是有些关系,linux的exit函数直接异常退出就不用清理内存的;另外跟平台有些关系,基于CLR语言标准平台如java、.NET等会自己回收的。
3、同2答案。

#6


引用 3 楼 cfjtaishan 的回复:
程序执行结束后,malloc申请的空间,系统会释放它们。这是系统对该程序的所有资源进行的回收。

那这样的话只要程序运行时间不是很长,即使不使用free,也不会造成内存泄露了?

#7



void GetMemory(char** p, int len) 

    *p = (char*)malloc(len); 

void main(void) 

    char* str; 
    GetMemory(&str, 100); 
    strcpy(str, “Hello World”); 
    printf(str); 


在上面的程序是一般的笔试题,比较认可的说法是上面的程序能够正确输出Hello World,但是会存在内存泄露。如果系统会对程序的所有资源进行回收的话,怎么会造成内存泄露呢

#8


引用 7 楼 gaochizhen33 的回复:
C/C++ code

void GetMemory(char** p, int len) 

    *p = (char*)malloc(len); 

void main(void) 

    char* str; 
    GetMemory(&str, 100); 
    strcpy(str, “Hello World”); 
    pr……

有些程序是不会停止的要一直运行 或者 程序大 调用很多次  不就尴尬了。。。

#9


引用 7 楼 gaochizhen33 的回复:
C/C++ code

void GetMemory(char** p, int len) 

    *p = (char*)malloc(len); 

void main(void) 

    char* str; 
    GetMemory(&str, 100); 
    strcpy(str, “Hello World”); 
    pr……


这个程序会引起内存泄露,因为在程序内部malloc()函数开辟的空间没有释放,但是对于该程序而言,由于程序生存周期很小,所以内存泄露不会对计算机造成影响,一般来说,以下这些程序需要考虑内存泄露:服务器端程序,操作系统,或者游戏,这些程序经常一运行就是几天甚至更长的时间,如果malloc开辟的内存没有及时回收,会让计算机瘫痪。

#10


引用 7 楼 gaochizhen33 的回复:
C/C++ code


void GetMemory(char** p, int len) 

    *p = (char*)malloc(len); 

void main(void) 

    char* str; 
    GetMemory(&str, 100); 
    strcpy(str, “Hello World”); 
    ……

操作系统必然可以回收,不然的话如果进程被杀死或ctrl C终止等异常都会导致内存泄漏,这样操作系统将很容易崩溃

#11


引用 9 楼 wzhwisk 的回复:
引用 7 楼 gaochizhen33 的回复:
C/C++ code

void GetMemory(char** p, int len)
{
*p = (char*)malloc(len);
}
void main(void)
{
char* str;
GetMemory(&str, 100);
strcpy(str, “Hello World”);
p……

的却这样,c语言对于指针的使用一定要严谨。

#12


引用 8 楼 yang122610 的回复:
引用 7 楼 gaochizhen33 的回复:
C/C++ code

void GetMemory(char** p, int len)
{
*p = (char*)malloc(len);
}
void main(void)
{
char* str;
GetMemory(&str, 100);
strcpy(str, “Hello World”);
p……

的确是这样,程序在执行过程中,如果内存没有释放会造成内存泄露,在嵌入式程序中这种情况尤为明显。
现在主要是想请教下,如果程序执行完毕,系统是否能够主动收回动态分配的内存,回到帖子开头提出的问题上,不要讨论在程序执行中内存的释放问题。

#13


1、这些函数分配的内存在整个程序退出后动态分配的内存是否会被系统自动回收?

2、如果自动回收跟语言的回收机制有关系还是跟操作系统的回收机制有关系?
跟操作系统的回收机制有关系
3、哪些语言或平台会在对内存进行监管在程序退出时主动回收内存?
Windows、Linux

#14


java自动回收

C++
new 一定要有delete

C
malloc  free

#15


引用 13 楼 zhao4zhong1 的回复:
1、这些函数分配的内存在整个程序退出后动态分配的内存是否会被系统自动回收?

2、如果自动回收跟语言的回收机制有关系还是跟操作系统的回收机制有关系?
跟操作系统的回收机制有关系
3、哪些语言或平台会在对内存进行监管在程序退出时主动回收内存?
Windows、Linux

这样说的话 在Windows和Linux平台下如果程序不是一直运行的话,不主动free也不会有任何问题吧?考虑极限的情况,内存足够大,在运行过程中没有free也不会造成内存不足。

#16


引用 9 楼 wzhwisk 的回复:
引用 7 楼 gaochizhen33 的回复:
C/C++ code

void GetMemory(char** p, int len)
{
*p = (char*)malloc(len);
}
void main(void)
{
char* str;
GetMemory(&str, 100);
strcpy(str, “Hello World”);
……


同意此说法则,再没有调用系统的exit回收资源之前,程序就已经崩溃了。。。

#17


1、这些函数分配的内存在整个程序退出后动态分配的内存是否会被系统自动回收?
   会  可以通过程序申请一块空间,记下地址,不加free,运行后关闭在运行时,这块空间会再次被分配
2、如果自动回收跟语言的回收机制有关系还是跟操作系统的回收机制有关系?
  跟操作系统  c语言可定是没有回收机制的
3、哪些语言或平台会在对内存进行监管在程序退出时主动回收内存
   JAVA JAVA的垃圾回收器会自动回收,所以java中new后无需做delete之类的操作,实际上,java是存面向对象的语言,除了主类,其他的对象都要new的,所以语言自带回收内存机制。

#1


好像是操作系统在进程结束之后会有对进程所用资源进行回收。

#2


该回复于2011-11-28 13:27:04被版主删除

#3


程序执行结束后,malloc申请的空间,系统会释放它们。这是系统对该程序的所有资源进行的回收。

#4


程序结素后,系统会释放进程.进程内所有资源都被释放.所以内存也被回收.
语言的回收机制,如JAVA等,是在该资源用完后自动回收,并不一定是在程序结束后.

#5


1、这个两个函数分配的都是在堆中分配的空间,要程序自己释放的,操作系统不会回收的。
2、这个问题,我感觉跟操作系统也是有些关系,linux的exit函数直接异常退出就不用清理内存的;另外跟平台有些关系,基于CLR语言标准平台如java、.NET等会自己回收的。
3、同2答案。

#6


引用 3 楼 cfjtaishan 的回复:
程序执行结束后,malloc申请的空间,系统会释放它们。这是系统对该程序的所有资源进行的回收。

那这样的话只要程序运行时间不是很长,即使不使用free,也不会造成内存泄露了?

#7



void GetMemory(char** p, int len) 

    *p = (char*)malloc(len); 

void main(void) 

    char* str; 
    GetMemory(&str, 100); 
    strcpy(str, “Hello World”); 
    printf(str); 


在上面的程序是一般的笔试题,比较认可的说法是上面的程序能够正确输出Hello World,但是会存在内存泄露。如果系统会对程序的所有资源进行回收的话,怎么会造成内存泄露呢

#8


引用 7 楼 gaochizhen33 的回复:
C/C++ code

void GetMemory(char** p, int len) 

    *p = (char*)malloc(len); 

void main(void) 

    char* str; 
    GetMemory(&str, 100); 
    strcpy(str, “Hello World”); 
    pr……

有些程序是不会停止的要一直运行 或者 程序大 调用很多次  不就尴尬了。。。

#9


引用 7 楼 gaochizhen33 的回复:
C/C++ code

void GetMemory(char** p, int len) 

    *p = (char*)malloc(len); 

void main(void) 

    char* str; 
    GetMemory(&str, 100); 
    strcpy(str, “Hello World”); 
    pr……


这个程序会引起内存泄露,因为在程序内部malloc()函数开辟的空间没有释放,但是对于该程序而言,由于程序生存周期很小,所以内存泄露不会对计算机造成影响,一般来说,以下这些程序需要考虑内存泄露:服务器端程序,操作系统,或者游戏,这些程序经常一运行就是几天甚至更长的时间,如果malloc开辟的内存没有及时回收,会让计算机瘫痪。

#10


引用 7 楼 gaochizhen33 的回复:
C/C++ code


void GetMemory(char** p, int len) 

    *p = (char*)malloc(len); 

void main(void) 

    char* str; 
    GetMemory(&str, 100); 
    strcpy(str, “Hello World”); 
    ……

操作系统必然可以回收,不然的话如果进程被杀死或ctrl C终止等异常都会导致内存泄漏,这样操作系统将很容易崩溃

#11


引用 9 楼 wzhwisk 的回复:
引用 7 楼 gaochizhen33 的回复:
C/C++ code

void GetMemory(char** p, int len)
{
*p = (char*)malloc(len);
}
void main(void)
{
char* str;
GetMemory(&str, 100);
strcpy(str, “Hello World”);
p……

的却这样,c语言对于指针的使用一定要严谨。

#12


引用 8 楼 yang122610 的回复:
引用 7 楼 gaochizhen33 的回复:
C/C++ code

void GetMemory(char** p, int len)
{
*p = (char*)malloc(len);
}
void main(void)
{
char* str;
GetMemory(&str, 100);
strcpy(str, “Hello World”);
p……

的确是这样,程序在执行过程中,如果内存没有释放会造成内存泄露,在嵌入式程序中这种情况尤为明显。
现在主要是想请教下,如果程序执行完毕,系统是否能够主动收回动态分配的内存,回到帖子开头提出的问题上,不要讨论在程序执行中内存的释放问题。

#13


1、这些函数分配的内存在整个程序退出后动态分配的内存是否会被系统自动回收?

2、如果自动回收跟语言的回收机制有关系还是跟操作系统的回收机制有关系?
跟操作系统的回收机制有关系
3、哪些语言或平台会在对内存进行监管在程序退出时主动回收内存?
Windows、Linux

#14


java自动回收

C++
new 一定要有delete

C
malloc  free

#15


引用 13 楼 zhao4zhong1 的回复:
1、这些函数分配的内存在整个程序退出后动态分配的内存是否会被系统自动回收?

2、如果自动回收跟语言的回收机制有关系还是跟操作系统的回收机制有关系?
跟操作系统的回收机制有关系
3、哪些语言或平台会在对内存进行监管在程序退出时主动回收内存?
Windows、Linux

这样说的话 在Windows和Linux平台下如果程序不是一直运行的话,不主动free也不会有任何问题吧?考虑极限的情况,内存足够大,在运行过程中没有free也不会造成内存不足。

#16


引用 9 楼 wzhwisk 的回复:
引用 7 楼 gaochizhen33 的回复:
C/C++ code

void GetMemory(char** p, int len)
{
*p = (char*)malloc(len);
}
void main(void)
{
char* str;
GetMemory(&str, 100);
strcpy(str, “Hello World”);
……


同意此说法则,再没有调用系统的exit回收资源之前,程序就已经崩溃了。。。

#17


1、这些函数分配的内存在整个程序退出后动态分配的内存是否会被系统自动回收?
   会  可以通过程序申请一块空间,记下地址,不加free,运行后关闭在运行时,这块空间会再次被分配
2、如果自动回收跟语言的回收机制有关系还是跟操作系统的回收机制有关系?
  跟操作系统  c语言可定是没有回收机制的
3、哪些语言或平台会在对内存进行监管在程序退出时主动回收内存
   JAVA JAVA的垃圾回收器会自动回收,所以java中new后无需做delete之类的操作,实际上,java是存面向对象的语言,除了主类,其他的对象都要new的,所以语言自带回收内存机制。