为什么我的小程序运行,占用内存会越来越大

smallprogrammer 2010-05-27 12:26:45
如题所述,我的一个读写数据库的程序。用一个线程执行 插入100W条数据到SQL2000数据库。程序运行时占用内存2M左右,3分钟后大概是8M 越来越大,是不是我的程序有资源没释放?

数据库操作类代码如下:

#include "DBManage.h"

DBManage::DBManage(void)
{
CoInitialize(NULL);
//string m_StrConnecion = "Provider=SQLOLEDB; Server=192.168.1.101;Database=test; uid=sa; pwd=sin3002;";
_bstr_t m_StrConnecion("Provider=SQLOLEDB; Server=192.168.1.101;Database=test; uid=sa; pwd=sin3002;");

connection.CreateInstance(__uuidof(Connection));
//设置服务器端游标
connection->CursorLocation = adUseServer;
connection->Open(m_StrConnecion, "","",adOpenUnspecified);
}

DBManage::~DBManage(void)
{
if(connection)
{
connection->Close();
connection = NULL;
}
CoUninitialize();
}

int DBManage::executeUpdate(string sql)
{
if(!connection)
{
return -1;
}

_variant_t RecordsAffected;
connection->Execute(sql.c_str(),&RecordsAffected,adCmdText);

RecordsAffected.ChangeType(VT_I4, NULL);
int nRows = V_I4(&RecordsAffected);

return nRows;
}


下面是Main方法,代码如下:

#include "stdafx.h"
#include <iostream>
#include "DBManage.h"
#include <process.h>

using namespace std;

unsigned _stdcall AddUserProc(void *Param){
for(int i=0; i<1000000; i++)
{
DBManage* db = new DBManage();

string strSql = "insert into t_user (user_name, user_pwd) values ('name', 'pwd')";
db->executeUpdate(strSql);

delete db;
db = NULL;
}

return 0;
}

int _tmain()
{
UINT Thrdaddr;
HANDLE h;
h = (HANDLE)::_beginthreadex( NULL, 0, AddUserProc, 0, 0, &Thrdaddr);

::WaitForSingleObject(h, 5000000L);
::CloseHandle(h);

cout<<"操作结束-----------------------------------"<<endl;
system("PAUSE");
return 0;
}


...全文
1098 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
smallprogrammer 2010-05-27
  • 打赏
  • 举报
回复
放在循环外面我也测试过,测试证明速度快很多,内存、句柄都比较稳定。所以现在问题还是处在 DBManage 这个类里面。可能有些东西没释放
bilaopao 2010-05-27
  • 打赏
  • 举报
回复
正如三楼所说,如有泄露Debug模式下会有提示的。
smallprogrammer 2010-05-27
  • 打赏
  • 举报
回复
这部分我之所以放在循环里面,就是想要测试下这个操作数据库的类。以现在的结果来看是有问题的,占用内存越来越大。。。
向立天 2010-05-27
  • 打赏
  • 举报
回复
如果有内存泄漏
你在debug模式下结束程序的时候输出窗口会有显示的
至于定位
你可以屏蔽掉一些代码在运行看看具体是那些代码出的问题
对于你这些代码
写的很工整
看不出什么问题
不过我觉得
DBManage* db = new DBManage();
delete db;
db = NULL;

这部分没必要在循环里吧
kaynezhang 2010-05-27
  • 打赏
  • 举报
回复
unsigned _stdcall AddUserProc(void *Param){
for(int i=0; i<1000000; i++)
{
DBManage* db = new DBManage();

string strSql = "insert into t_user (user_name, user_pwd) values ('name', 'pwd')";
db->executeUpdate(strSql);

delete db;
db = NULL;

}

return 0;
}
红色的这些为什么不放循环外面????
smallprogrammer 2010-05-27
  • 打赏
  • 举报
回复
请高手帮忙。。。
smallprogrammer 2010-05-27
  • 打赏
  • 举报
回复
我源码都贴一下 有兴趣的朋友可以自己试试,看看有没有其他解决方法。

DBManage.h

#pragma once
#include <string>
#include <windows.h>
#import "msado15.dll" no_namespace rename("EOF","adoEOF")
using namespace std;

class DBManage
{
public:
DBManage(void);
~DBManage(void);
private:
_ConnectionPtr connection;

public:
/*
描述:
执行更新语句,返回受影响的记录数
参数:
sql 要操作的SQL语句
返回值:
操作影响的记录数
*/
int executeUpdate(string sql);

};


DBManage.cpp

#include "DBManage.h"

DBManage::DBManage(void)
{
CoInitialize(NULL);
_bstr_t m_StrConnecion("Provider=SQLOLEDB; Server=192.168.1.101;Database=test; uid=sa; pwd=sin3002;");

connection.CreateInstance(__uuidof(Connection));
connection->CursorLocation = adUseServer;
connection->Open(m_StrConnecion, "","",adOpenUnspecified);
}

DBManage::~DBManage(void)
{
if(connection)
{
connection->Close();
connection = NULL;
}
CoUninitialize();
}

int DBManage::executeUpdate(string sql)
{
if(!connection)
{
return -1;
}

_variant_t RecordsAffected;
connection->Execute(sql.c_str(),&RecordsAffected,adCmdText);

RecordsAffected.ChangeType(VT_I4, NULL);
int nRows = V_I4(&RecordsAffected);

return nRows;
}

TestPro.cpp

#include "stdafx.h"
#include <iostream>
#include "DBManage.h"
#include <process.h>

using namespace std;

unsigned _stdcall AddUserProc(void *Param){
for(int i=0; i<1000000; i++)
{
DBManage* db = new DBManage();

string strSql = "insert into t_user (user_name, user_pwd) values ('name', 'pwd')";
db->executeUpdate(strSql);

delete db;
db = NULL;
::Sleep(1L);
}
return 0;
}

int _tmain()
{
UINT Thrdaddr;
HANDLE h;
h = (HANDLE)::_beginthreadex( NULL, 0, AddUserProc, 0, 0, &Thrdaddr);

::WaitForSingleObject(h, 5000000L);
::CloseHandle(h);

cout<<"操作结束-----------------------------------"<<endl;
system("PAUSE");
return 0;
}
smallprogrammer 2010-05-27
  • 打赏
  • 举报
回复

unsigned _stdcall AddUserProc(void *Param){
for(int i=0; i<10000; i++)
{
DBManage* db = new DBManage();

string strSql = "insert into t_user (user_name, user_pwd) values ('name', 'pwd')";
db->executeUpdate(strSql);

delete db;
db = NULL;
::Sleep(100L);
}
return 0;
}

加个等待,效果好多了。占用内存在2500K左右徘徊。不会明显增加,多谢楼上诸位兄弟。
wwgddx 2010-05-27
  • 打赏
  • 举报
回复
会不会是
DBManage* db = new DBManage();
delete db;
db = NULL;
调用速度太快,导致来不及delete. 你在中间加个等待试试.
zhou1xp 2010-05-27
  • 打赏
  • 举报
回复
RecordsAffected是不是数据集,这个不需要释放么??
smallprogrammer 2010-05-27
  • 打赏
  • 举报
回复
你把路径改下好了

#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename ("EOF", "adoEOF")

finder_zhang 2010-05-27
  • 打赏
  • 举报
回复
想帮你试试代码的,但是我报这个错,试不了啊.
fatal error C1083: Cannot open type library file: 'msado15.dll': No such file or directory
smallprogrammer 2010-05-27
  • 打赏
  • 举报
回复
我代码里面已经加上了这个语句
代码:

unsigned _stdcall AddUserProc(void *Param){
for(int i=0; i<10000; i++)
{
DBManage* db = new DBManage();

string strSql = "insert into t_user (user_name, user_pwd) values ('name', 'pwd')";
db->executeUpdate(strSql);

delete db;
db = NULL;
}

return 0;
}

[Quote=引用 7 楼 jennyvenus 的回复:]
DBManage* db = new DBManage();


加上
delete db;
[/Quote]
smallprogrammer 2010-05-27
  • 打赏
  • 举报
回复
DBManage.h 源码


#pragma once
#include <string>
#include <windows.h>
#import "msado15.dll" no_namespace rename("EOF","adoEOF")
using namespace std;

class DBManage
{
public:
DBManage(void);
~DBManage(void);
private:
_ConnectionPtr connection;

public:
/*
描述:
执行更新语句,返回受影响的记录数
参数:
sql 要操作的SQL语句
返回值:
操作影响的记录数
*/
int executeUpdate(string sql);

};
finder_zhang 2010-05-27
  • 打赏
  • 举报
回复
楼主,#include "DBManage.h" 这个也发来看看.
用户 昵称 2010-05-27
  • 打赏
  • 举报
回复
DBManage* db = new DBManage();


加上
delete db;

16,471

社区成员

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

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

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