连接后,内存占用增大到6532KB。
关闭ADO连接后,m_pConnection->Close(),
内存占用没有减少,还是6532KB
请问该怎么释放
7 个解决方案
#1
1.使用boundchecker来测试测试,看到底有没有内存泄露。
2.另外在程序退出的时候,是否有内存泄露,如果没有,就没有关系,因为在程序刚启动的时候,可能没有用一些内存,如全局的变量,但当程序退出的时候,可能才释放内存。这就不能说内存会泄露。所以需要仔细的测试。
3.使用CString和_bstr_t之间的转化时,可能会造成内存泄露。
2.另外在程序退出的时候,是否有内存泄露,如果没有,就没有关系,因为在程序刚启动的时候,可能没有用一些内存,如全局的变量,但当程序退出的时候,可能才释放内存。这就不能说内存会泄露。所以需要仔细的测试。
3.使用CString和_bstr_t之间的转化时,可能会造成内存泄露。
#2
使用 Close 方法可关闭 Connection 对象或 Recordset 对象以便释放所有关联的系统资源。关闭对象并非将它从内存中删除,可以更改它的属性设置并且在此后再次打开。要将对象从内存中完全删除,可将对象变量设置为 Nothing。
m_pConnection = NULL;
#3
先release,在付null
#4
谢谢各位热心朋友积极回复。
我试了一下 m_pConnection->Close(); m_pConnection =NULL;
只能释放几十KB内存啊。
另外,请问一下release()怎么用,好像不能和Close()一起用,程序会崩溃呀
我试了一下 m_pConnection->Close(); m_pConnection =NULL;
只能释放几十KB内存啊。
另外,请问一下release()怎么用,好像不能和Close()一起用,程序会崩溃呀
#5
try
{
if(m_pAppConn!=NULL)
{
if(m_pAppConn->State!=adStateClosed)
{
hResult=m_pAppConn->Close();
}
m_pAppConn.Release();
}
}
{
if(m_pAppConn!=NULL)
{
if(m_pAppConn->State!=adStateClosed)
{
hResult=m_pAppConn->Close();
}
m_pAppConn.Release();
}
}
#6
To:handsomerun(毛毛)
我试了一下这段代码
try
{
if(m_pConnection!=NULL)
{
if(m_pConnection->State!=adStateClosed)
{
m_pConnection->Close();
}
m_pConnection.Release();
m_pConnection = NULL;
}
}
catch(_com_error e)
{
return;
}
还是只能释放几十KB内存啊,真怀疑ADO是不是有问题
我试了一下这段代码
try
{
if(m_pConnection!=NULL)
{
if(m_pConnection->State!=adStateClosed)
{
m_pConnection->Close();
}
m_pConnection.Release();
m_pConnection = NULL;
}
}
catch(_com_error e)
{
return;
}
还是只能释放几十KB内存啊,真怀疑ADO是不是有问题
#7
放心
这不是你的问题,是操作系统的问题
WINDOWS下,内存的分配是按页进行的
但并不是你提交就立即分配,而是有个虚拟分配过程,只有当你实际使用到后,操作系统才实际分配
同样,当你释放的时候,它并不能象你想象的那样完全释放,而是有操作系统调度,它依然可能保留给你的进程,当一段时间,例如几十秒你还是没有新的内存要求,操作系统才可能回收内存
另外ADO是个多线程COM,线程需要等一点实际才能完全退出,因此,你应该等待5-10分钟,才可以彻底退出,不过如果进程结束的话,则线程立即退出,ADO为什么线程不能同步结束,我也不知道,但是它确实有这个问题
此外,象CString std::string这样的变量,可能由于没有清空而占用内存,至于ADO本身的指针,实际是个智能指针,你只要将它赋予NULL,就可以释放掉了,不会导致内存泄漏的。
这不是你的问题,是操作系统的问题
WINDOWS下,内存的分配是按页进行的
但并不是你提交就立即分配,而是有个虚拟分配过程,只有当你实际使用到后,操作系统才实际分配
同样,当你释放的时候,它并不能象你想象的那样完全释放,而是有操作系统调度,它依然可能保留给你的进程,当一段时间,例如几十秒你还是没有新的内存要求,操作系统才可能回收内存
另外ADO是个多线程COM,线程需要等一点实际才能完全退出,因此,你应该等待5-10分钟,才可以彻底退出,不过如果进程结束的话,则线程立即退出,ADO为什么线程不能同步结束,我也不知道,但是它确实有这个问题
此外,象CString std::string这样的变量,可能由于没有清空而占用内存,至于ADO本身的指针,实际是个智能指针,你只要将它赋予NULL,就可以释放掉了,不会导致内存泄漏的。
#1
1.使用boundchecker来测试测试,看到底有没有内存泄露。
2.另外在程序退出的时候,是否有内存泄露,如果没有,就没有关系,因为在程序刚启动的时候,可能没有用一些内存,如全局的变量,但当程序退出的时候,可能才释放内存。这就不能说内存会泄露。所以需要仔细的测试。
3.使用CString和_bstr_t之间的转化时,可能会造成内存泄露。
2.另外在程序退出的时候,是否有内存泄露,如果没有,就没有关系,因为在程序刚启动的时候,可能没有用一些内存,如全局的变量,但当程序退出的时候,可能才释放内存。这就不能说内存会泄露。所以需要仔细的测试。
3.使用CString和_bstr_t之间的转化时,可能会造成内存泄露。
#2
使用 Close 方法可关闭 Connection 对象或 Recordset 对象以便释放所有关联的系统资源。关闭对象并非将它从内存中删除,可以更改它的属性设置并且在此后再次打开。要将对象从内存中完全删除,可将对象变量设置为 Nothing。
m_pConnection = NULL;
#3
先release,在付null
#4
谢谢各位热心朋友积极回复。
我试了一下 m_pConnection->Close(); m_pConnection =NULL;
只能释放几十KB内存啊。
另外,请问一下release()怎么用,好像不能和Close()一起用,程序会崩溃呀
我试了一下 m_pConnection->Close(); m_pConnection =NULL;
只能释放几十KB内存啊。
另外,请问一下release()怎么用,好像不能和Close()一起用,程序会崩溃呀
#5
try
{
if(m_pAppConn!=NULL)
{
if(m_pAppConn->State!=adStateClosed)
{
hResult=m_pAppConn->Close();
}
m_pAppConn.Release();
}
}
{
if(m_pAppConn!=NULL)
{
if(m_pAppConn->State!=adStateClosed)
{
hResult=m_pAppConn->Close();
}
m_pAppConn.Release();
}
}
#6
To:handsomerun(毛毛)
我试了一下这段代码
try
{
if(m_pConnection!=NULL)
{
if(m_pConnection->State!=adStateClosed)
{
m_pConnection->Close();
}
m_pConnection.Release();
m_pConnection = NULL;
}
}
catch(_com_error e)
{
return;
}
还是只能释放几十KB内存啊,真怀疑ADO是不是有问题
我试了一下这段代码
try
{
if(m_pConnection!=NULL)
{
if(m_pConnection->State!=adStateClosed)
{
m_pConnection->Close();
}
m_pConnection.Release();
m_pConnection = NULL;
}
}
catch(_com_error e)
{
return;
}
还是只能释放几十KB内存啊,真怀疑ADO是不是有问题
#7
放心
这不是你的问题,是操作系统的问题
WINDOWS下,内存的分配是按页进行的
但并不是你提交就立即分配,而是有个虚拟分配过程,只有当你实际使用到后,操作系统才实际分配
同样,当你释放的时候,它并不能象你想象的那样完全释放,而是有操作系统调度,它依然可能保留给你的进程,当一段时间,例如几十秒你还是没有新的内存要求,操作系统才可能回收内存
另外ADO是个多线程COM,线程需要等一点实际才能完全退出,因此,你应该等待5-10分钟,才可以彻底退出,不过如果进程结束的话,则线程立即退出,ADO为什么线程不能同步结束,我也不知道,但是它确实有这个问题
此外,象CString std::string这样的变量,可能由于没有清空而占用内存,至于ADO本身的指针,实际是个智能指针,你只要将它赋予NULL,就可以释放掉了,不会导致内存泄漏的。
这不是你的问题,是操作系统的问题
WINDOWS下,内存的分配是按页进行的
但并不是你提交就立即分配,而是有个虚拟分配过程,只有当你实际使用到后,操作系统才实际分配
同样,当你释放的时候,它并不能象你想象的那样完全释放,而是有操作系统调度,它依然可能保留给你的进程,当一段时间,例如几十秒你还是没有新的内存要求,操作系统才可能回收内存
另外ADO是个多线程COM,线程需要等一点实际才能完全退出,因此,你应该等待5-10分钟,才可以彻底退出,不过如果进程结束的话,则线程立即退出,ADO为什么线程不能同步结束,我也不知道,但是它确实有这个问题
此外,象CString std::string这样的变量,可能由于没有清空而占用内存,至于ADO本身的指针,实际是个智能指针,你只要将它赋予NULL,就可以释放掉了,不会导致内存泄漏的。