[讨论]关于内存泄漏问题

elabs 2003-12-15 05:01:25
一直以来我总是认为一个程序有内存泄漏后,即使程序退出了那块内存也不能再被收回,可是现在我今天作个试验证明,内存泄漏后,当程序退出却发现内存被自动收回了。希望谁能指教一下,是系统得功能还是程序本来泄漏就是只得是程序运行时候得问题。
#include <stdlib.h> /* For _MAX_PATH definition */
#include <stdio.h>
#include <malloc.h>
#include <iostream.h>


void main()
{

int a;
void *pc;

cout << "begin" << endl;

cin >> a;

pc = malloc( 1024*1024*100 );

//new char[1024*1024*100];//使用new也是一个效果

cout << "new" << endl;

cin >> a;


}
...全文
40 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
elabs 2003-12-16
  • 打赏
  • 举报
回复
我现在讨论得不是内存是否需要释放,当然如果你得一个类在系统运行过程是一个连续不间断过程,会无数次产生实例,那你必须在每个实例使用完成后显示得free掉。

我得意思是如果该实例只是唯一得,那这个实例就没有必要被释放,因为内存会在程序退出时候被系统释放。
beyondtkl 2003-12-16
  • 打赏
  • 举报
回复
我觉得在合适的时刻 必须要进行给自己分配的空间释放
做到对内存的随时掌控 那么你对程序的流程应该就很清楚》
flyelf 2003-12-16
  • 打赏
  • 举报
回复
在某些时候,程序中的内存泄漏/资源泄漏是可以接受的,比如一个运行几分钟就退出的程序所造成的泄漏,不会造成什么太大的影响,但是对于那些需要长时间运行的程序来说,就有可能因为内存泄漏而导致程序崩溃,而客户肯定不希望看到这点
sursun 2003-12-15
  • 打赏
  • 举报
回复
强健的OS应该有内存泄漏的处理保护的机制!
hamham 2003-12-15
  • 打赏
  • 举报
回复
最好养成习惯 分配后记得释放 当然自始至终都存在的内存不释放也没问题 操作系统会自动回收
elabs 2003-12-15
  • 打赏
  • 举报
回复
哦,楼上有不同意见了,那你可以现试试我最开始那个程序,显示得分配了100M内存,够大了吧,没有进行释放,程序退出时候,看任务管理器,你会发现,内存确实被free掉了。
checkyvc6 2003-12-15
  • 打赏
  • 举报
回复
应该不是,内存泄漏是不可回收的,一般在堆里面分配的一定要在程序结束之后释放掉。
elabs 2003-12-15
  • 打赏
  • 举报
回复
现在纠正了我一直以来得一个错误观点,就是内存泄漏即使该程序退出后也会对系统有所影响,应该说所谓得内存泄漏是再应用程序运行过程中产生得多次内存分配,而没有去free掉该段内存,造成内存不足使应用程序崩溃得现象,即使程序由于内存泄漏出现错误,也不会对系统有所影响,当程序退出时候系统会对应用程序所占用得资源进行清理。
ISunwu 2003-12-15
  • 打赏
  • 举报
回复
如果一个内存块在程序运行期间从始至终都必须存在,那么在最后不释放也不算是泄漏(MFC中有很多这样的例子)。否则,就必须及时释放。
elabs 2003-12-15
  • 打赏
  • 举报
回复
恩同意 flyelf(空谷清音) 得说法,那我现在如果有一个类
//.h
class ACE_Thread_Manager{
public:
static ACE_Thread_Manager *instance (void);
private:
ACE_Thread_Manager();
public:
~ACE_Thread_Manager();
private:
static ACE_Thread_Manager *thr_mgr_;
static int delete_thr_mgr_;
};

//.cpp
# define ACE_NEW_RETURN(POINTER,CONSTRUCTOR) \
do { POINTER = new CONSTRUCTOR; \
if (POINTER == 0) { printf("mem is error");} \
} while (0)

#include <stdio.h>
#include "ThreadManager.h"

ACE_Thread_Manager *ACE_Thread_Manager::thr_mgr_ = NULL;
int ACE_Thread_Manager::delete_thr_mgr_ = 0;

ACE_Thread_Manager::ACE_Thread_Manager()
{
printf("ACE_Thread_Manager::ACE_Thread_Manager\n");
}
ACE_Thread_Manager::~ACE_Thread_Manager()
{
printf("ACE_Thread_Manager::~ACE_Thread_Manager\n");
}

ACE_Thread_Manager *ACE_Thread_Manager::instance (void)
{
printf("ACE_Thread_Manager::instance\n");
if (ACE_Thread_Manager::thr_mgr_ == 0)
{
// Perform Double-Checked Locking Optimization.
if (ACE_Thread_Manager::thr_mgr_ == NULL)
{
ACE_NEW_RETURN (ACE_Thread_Manager::thr_mgr_,
ACE_Thread_Manager);
ACE_Thread_Manager::delete_thr_mgr_ = 1;
}
}

return ACE_Thread_Manager::thr_mgr_;
}

那么我如果使用这个类,那么这个静态指针我觉得就没有必要释放,因为全局中只有这个一个实例存在,泄漏一次(我觉得呢,只分配一次内存,就不算是内存泄漏)。

这个是设计模式中提到得实例唯一得例子
火电 2003-12-15
  • 打赏
  • 举报
回复
所谓的内存泄漏
是说 NEW 了一个东西,在使用完后没有释放掉
所以越来越多的时候就会引起内存不足

一两次可能察觉不到把,
flyelf 2003-12-15
  • 打赏
  • 举报
回复
程序结束,系统会自动回收该进程的内存

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧