问题描述:一个服务程序每次循环就占用100k左右内存,不知道哪里有内存泄露。望大虾们帮忙看看。
代码如下:
while (ServiceStatus.dwCurrentState  == SERVICE_RUNNING)
{
int final = 0;
int guessmax = 0;
int copyjoinNum = 0;
MYSQL* mysql;  
mysql = mysql_init(NULL);
if(mysql == NULL)
{ mysql_library_end(); }
if (NULL == mysql_real_connect(mysql,host,uname,upassword,db,3306,NULL,0))
{   mysql_library_end(); }
mysql_set_character_set(mysql,"gbk");
char sql[5000] = {0};
char balloneState[5000]={0};
int currenttime = CTime::GetCurrentTime().GetTime();
sprintf(sql,"select count(oid) from table);
int rc = mysql_query(mysql,sql);
MYSQL_RES *result = mysql_store_result(mysql);
MYSQL_ROW localrow = mysql_fetch_row(result);
int resultcount = atoi(localrow[0]);
mysql_free_result(result);
if(resultcount>0)
                {  略  }
                else
                {     //写一个字符串到txt文件
                  sprintf(balloneState,"{'status':'5'},'result_info':[]}"); 
int result = WriteToLog(balloneState);
if (result)
{
ServiceStatus.dwCurrentState = SERVICE_STOPPED; 
ServiceStatus.dwWin32ExitCode = -1;
SetServiceStatus(hStatus, &ServiceStatus);
return;
}
Sleep(3000);
 }
mysql_close(mysql);
mysql_library_end();
}每次循环都占用一定的内存,怎么解决阿? 是不是开头那几个变量每次都占用内存? 如何让每次执行一次后就清空一下内存空间呢?

解决方案 »

  1.   

    我估计是WriteToLog的问题,你注释掉看看应该会有改观。常数没有问题,可能有问题的是MYSQL的实例没有释放,也许你只是关闭了连接而没有释放对象。对MySQL的机制不是很熟悉,不敢乱说
      

  2.   

    WriteToLog 函数是这样的:  GBKToUTF8是一个转换函数。
    int WriteToLog(char* str)
    {
    CFile fok;
    while (!fok.Open(LOGFILE, CFile::modeCreate|CFile::modeReadWrite))
    {
    return -1;
    }
    BYTE buffer[102400];
    memset(buffer, 0, 102400);
    int i = GBKToUTF8((unsigned char*)(LPCSTR)str, buffer, 102400); //以utf8格式写入txt文本
    BYTE pHeaher[] = {0xEF, 0xBB, 0xBF};
    fok.Write(pHeaher, 3);
    fok.Write(buffer, i);
    fok.Close();
    return 0;
    }这里好像没有什么问题吧!?
      

  3.   

    凡是指针你最后都给free掉,比如result也是
      

  4.   

    不行,还是老问题。还有其它bug的地方吗?