关于几句代码的程序运行后内存使用不段增大的问题

ssjkcn 2009-03-25 02:39:20
#include "stdafx.h"
#include <afxinet.h>
#include <ShellApi.h>

void reset()
{
ShellExecute(NULL,"open","b.bat",NULL,NULL,SW_RESTORE);
}
int main()
{
while(1)
{
reset();
}
return 0;
}


如上几句代码,编译出来后,内存使用会不断增加,本来是想写一个监控IIS的小东西,网站打不开的时候就让他重启IIS,但是发现内存使用会不断变大,用不了一个晚上内存就给我耗尽了!

麻烦各位高手给我解答一下怎么回事,如何来处理这样一个问题!小弟是个新手!
...全文
253 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
songfuwen 2009-03-25
  • 打赏
  • 举报
回复
恩.是的!是下载网页.可能半小时挂一次!这些不都在一个函数体内吗?我好像记得在函数体内的变量.函数结束后就没了吧!而且myHttpFile用了close 了呀!
-----------------------------------------------------------------------------------------------------------------------------
这跟你的内存分配有关系啊,如果是在堆上分配的内存,是需要程序员管理的。
myHttpFile=(CHttpFile*)mySession.OpenURL(myUrl);
怀疑这个函数里在堆上分配了内存,而你没有去释放它。
herman~~ 2009-03-25
  • 打赏
  • 举报
回复
MARK
ssjkcn 2009-03-25
  • 打赏
  • 举报
回复
恩.是的!是下载网页.可能半小时挂一次!这些不都在一个函数体内吗?我好像记得在函数体内的变量.函数结束后就没了吧!而且myHttpFile用了close 了呀!
downmooner 2009-03-25
  • 打赏
  • 举报
回复
那...你IIS挂掉的时间多,还是正常的时间多...

一小时正常的话.你ReadString(myData) 应该是下载网页?

那得多少数据
ssjkcn 2009-03-25
  • 打赏
  • 举报
回复
bodycode 是iisreset函数内的变量,这个涵数返回了.他不会自动销毁吗?
downmooner 2009-03-25
  • 打赏
  • 举报
回复
.......

看错了我.

那IIS不挂掉的时候那你的string bodycode; 不是一直在增加吗
downmooner 2009-03-25
  • 打赏
  • 举报
回复
....

我一样看去 貌似 少了wsacleanup
ssjkcn 2009-03-25
  • 打赏
  • 举报
回复
#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
#include "stdafx.h"
#include <string>
#include <afxinet.h>
#include <winsock2.h>
#include <ShellApi.h>
#include <iostream>
#include <fstream>
#include <time.h>
#include <mmsystem.h>


using namespace std;



void iisreset()
{

string bodycode;
try
{

CInternetSession mySession("mysession");
CHttpFile* myHttpFile=NULL;
CString myData;
CString myUrl= "http://www.xxx.com";
CString m_SiteInfo;
CString writecode;

WSADATA WSAData={0};
struct sockaddr_in ServerAddr={0};
SOCKET ServerSocket=0;

myHttpFile=(CHttpFile*)mySession.OpenURL(myUrl);


while(myHttpFile->ReadString(myData))
{
LPCTSTR code= myData;
bodycode = bodycode+code ;
}

myHttpFile->Close();
mySession.Close();
}
catch(CException *e)
{
ShellExecute(NULL,"open","cmd.exe","/c iisreset",NULL,SW_HIDE);

}


int main()
{
while(1)
{
iisreset();
}
return 0;
}



整个代码是这样的!情况是这样!IIS上加载了一个ISAPI的DLL文件来处理一些特殊的数据!这个DLL可能不够完善, 偶尔IIS会挂掉网站打不开!!我写这个主要是想判断网站打不开的时候重启IIS!
ch1oE 2009-03-25
  • 打赏
  • 举报
回复
你的意思是说你的bat里面就一句类似pause的话,然后一直调用内存就会增加咯?

另外你最好确定下你的返回值。

还有就是居然用while这么搞,还搞了Windows的API一夜,它会做什么事情鬼才知道。。。

ssjkcn 2009-03-25
  • 打赏
  • 举报
回复
b.bat程序都干了些啥?能够正确退出?

在这个测试程序目录中没有这个b.bat,当执行的时候没找到b.bat就会退出,或者内容可以是iisreset 重启IIS完成后返回退出!
ssjkcn 2009-03-25
  • 打赏
  • 举报
回复
就以上这几句代码的程序来讲!我把ShellExecute 写在一个函数里!执行完了.应该占用的内存就会被释放!怎么内存使用率还会不断增加呢!
ssjkcn 2009-03-25
  • 打赏
  • 举报
回复
不是!用来监控的代码比我贴出来的代码多!我就是发现用来监控的程序运行后内存使用会一直增加!所以就另外写了一个简单的几句代码的程序测试.没想到内存使用一样会不断增加!所以就来请教一下大家!怎么解决这个问题!
downmooner 2009-03-25
  • 打赏
  • 举报
回复
while(1)
{
//你这里添加一个判断进程在不在.
reset();
}

这样while 1下去 估计一晚上的批处理也得有几十万次了
fibbery 2009-03-25
  • 打赏
  • 举报
回复
b.bat程序都干了些啥?能够正确退出?
lin_style 2009-03-25
  • 打赏
  • 举报
回复
ShellExecute?

这个你得贴出来

你没必要这样监控啊。。
先取进程名,判断有没这个进程名,没有再运行。

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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