嘎嘎:10行语句的小程序,内存泄漏的问题,高手先生请来看=>

forest_wawa 2002-02-06 09:36:02
#include <iostream.h>
#include <new>
void MemOutErr();
main() {
while(true) {
int * temp = new(MemOutErr) int[10000000]; //【语句一】
//int * temp = new int[10000000]; //【语句二】
}
}
void MemOutErr() {
cout << "Memory is out>:)" << endl;
}
问题1:
症状1——注释【语句一】使【语句二】生效,结果win2000的任务管理器上显示内存一直升高知道报告我虚拟内存不足程序,但是程序并不跳出;
症状2——注释【语句二】使【语句一】生效,结果win2000的任务管理器上显示内存没有什么变化,而且程序也并不跳出,MemOutErr()也没有被执行到。
这是为什么?
问题2:以前听某某谁说过,内存泄漏部分的资源,系统就再也无法回收,除非你Reboot操作系统,好像不对吧,症状1的描述中,我把程序关闭掉之后,管理器上显示内存占用数量就回复到运行前的状态了,哪位能为我解释一下这种现象。

谢谢啦!
...全文
80 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
DaNiao 2002-02-06
  • 打赏
  • 举报
回复
FPE大哥,看过你的程序我觉得我过去几年都白活了,
您能教教我吗?

int *可以直接转成void (*)()吗?
  • 打赏
  • 举报
回复
症状2:
void MemOutErr();
typedef void(*pFun)();
main() {
while(true) {
int * temp = new(MemOutErr) int[10000000]; //【语句一】
//int * temp = new int[10000000]; //【语句二】

pFun pf = (pFun)temp;

pf();
}
}
void MemOutErr() {
cout << "Memory is out>:)" << endl;
}
这样一来就可以运行MemOutErr()了.
DaNiao 2002-02-06
  • 打赏
  • 举报
回复
给楼上提个建议,你的cout后面最好加个flush这样比交好看一点。
DaNiao 2002-02-06
  • 打赏
  • 举报
回复
问题一:1。你的程序照理应该退出的,但VC在异常处理时并没有遵照C++98新标准来做,
在内存耗尽时new会产生一个bad_alloc类型的异常,按新标准如果一个异常
没有被catch程序就会被终止,所以你的程序如果是在gcc下就会跳出,但VC
在异常未被catch的情况下会继续执行throw之后的语句而不会跳出。
2。I don't know Y
我发现了一个小问题,你include了<new>但没加using namespace std;
这个头文件里的东西你应该是看不到的。
问题二:在你的程序被掐死之后,windows2000 会自动回收分配给你的页面。不排除存在
某个OS不回收的可能性。不过我在想,如果你把进程A的一块内存映射到进程B的空间
里去之后,再退出A,这一块内存应该不被回收才对,否则B恐怕就要出问题了。

我忽然想起DOS大概不会回收。
G_zcm 2002-02-06
  • 打赏
  • 举报
回复
同意楼上!
#include<new>
#include<iostream>

using namespace std;
void __cdecl newhandler( )
{
cout << "The new_handler is called:" << endl;
throw bad_alloc( );
return;
}

int main( )
{
set_new_handler (newhandler);
try
{
while ( 1 )
{
new int[5000000];
cout << "Allocating 5000000 ints." << endl;
}
}
catch ( exception e )
{
cout << e.what( ) << " xxx" << endl;
}
}
forest_wawa 2002-02-06
  • 打赏
  • 举报
回复
但是那个全局的operator new
的参数应该是(size_t size, new_handler xxxx)的啊!
tief 2002-02-06
  • 打赏
  • 举报
回复
并不是这样,NT为每个Application规划虚拟4G的内存,而且应用程序不可以访问自己占据的4G之外。所以程序崩溃后,系统可以回收所有内存资源。

如果要捕捉由于内存分配引起的异常,可以使用_set_new_handler,下面是VC的实现,可标准略有不同,但是其它的可以查阅C++ Reference.

#include <new.h>
int handle_program_memory_depletion( size_t )
{
// Your code
}
void main( void )
{
_set_new_handler( handle_program_memory_depletion );
int *pi = new int[BIG_NUMBER];
}

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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