首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

vector以致内存不断增长

2013-03-10 
vector导致内存不断增长C++新手,线程循环判断打印机队列信息10毫秒是方便测试使用.结果发现内存不断上升,

vector导致内存不断增长
C++新手,
线程循环判断打印机队列信息
10毫秒是方便测试使用.
结果发现内存不断上升,何解?


{
//文档名
CString documentName;
DWORD dStatus;
//序号
int dindex;
};
//获取打印队列详细信息返回vector
vector<CPrintDealSrv::PRINTER_JOB_INFO>* CPrintDealSrv::GetPrintJobList(void)
{
vector<PRINTER_JOB_INFO>* vlist = new vector<PRINTER_JOB_INFO>;

CString strPrinterName = _T("Microsoft XPS Document Writer");
HANDLE hPrintHandle;
LPTSTR lpPrinerName = strPrinterName.GetBuffer();
strPrinterName.ReleaseBuffer();


JOB_INFO_2 *pJobs;
int cJobs;
DWORD dwPrinterStatus;

PRINTER_JOB_INFO jobSimpleInfo;
jobSimpleInfo.documentName = pJobs[i].pDocument;
jobSimpleInfo.dindex  = (i+1);
jobSimpleInfo.dStatus = pJobs[i].Status;
vlist->push_back(jobSimpleInfo);


return vlist;
}
//线程方法
UINT CPrintDealSrv::thStartPrintSrv(LPVOID lparm)
{

CPrintDealSrv * pPrintDeal = (CPrintDealSrv*)lparm;
        vector<PRINTER_JOB_INFO>* vlist;
while(true)
{

vlist = pPrintDeal->GetPrintJobList();
Sleep(10);
delete vlist;
}
}

[解决办法]
vlist->clear(),然后再delete
[解决办法]
pJobs怎么来的?
[解决办法]
 vector<PRINTER_JOB_INFO>* vlist = new vector<PRINTER_JOB_INFO>;

为什么要这样创建啊?
[解决办法]
每10ms就调用CPrintDealSrv::GetPrintJobList(void)
并且这个函数里还要执行new操作。
    vector<PRINTER_JOB_INFO>* vlist = new vector<PRINTER_JOB_INFO>; 
效率太低了。

你可以且个全局变量或静态变量呀,这样就不要每次都分配内存了。
[解决办法]
定义为成员变量 都是
vector<CPoint*> vlist
CPoint *point= new CPoint;
vlist.push_back(point);
[解决办法]
试了一下,似乎问题没有出现在vector上。
检查一下向vector中添加的内容吧,lz贴的代码不完整,看不出来。

引用:
引用:vlist->clear(),然后再delete
clear无效

[解决办法]
成功后没看见你释放
pJobStorage = (JOB_INFO_2 *)malloc(cByteNeeded);这个申请的内存
[解决办法]

    //获取成功
    else{
        if (cJobs > 0)
        {
            //队列中有待打印文档
            for (int i = 0;i < cJobs; i ++)
            {
                PRINTER_JOB_INFO jobSimpleInfo;
                jobSimpleInfo.documentName = pJobs[i].pDocument;


                jobSimpleInfo.dindex  = (i+1);
                jobSimpleInfo.dStatus = pJobs[i].Status;
                vlistPrintJobInfo->push_back(jobSimpleInfo);
            }
        }
        //释放内存
        free pJobs;
    }

热点排行