【发布时间】:2011-08-18 13:03:06
【问题描述】:
我正在使用 C++ 和 Visual Studio 2005。
我有一个项目,内存增加很不正常。调试代码时,我意识到有几个部分对此有贡献。比如这样:
// has to add crypt32.lib to link
#include <windows.h>
#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
void memoryUP( const unsigned char *pData, int cData )
{
HCRYPTMSG msg = NULL;
HCRYPTPROV hProv = NULL;
CryptAcquireContext(&hProv,NULL,NULL,PROV_RSA_FULL,0);
msg = CryptMsgOpenToDecode(MY_ENCODING_TYPE,0,0,hProv,NULL,NULL);
if(!(CryptMsgUpdate( msg, pData, cData, TRUE)))
{
if(msg != NULL)
{
CryptMsgClose(msg);
msg = NULL;
}
}
if (hProv != NULL)
CryptReleaseContext(hProv,0);
if (msg != NULL)
{
CryptMsgClose(msg);
msg = NULL;
}
}
int main(int argc, char** argv)
{
MyFile myfile = myReadFile("c:\\file.p7s");
{
for(int i=0; i<100000; ++i)
{
memoryUP( myfile._data, myfile._length );
}
}
delete myfile;
return 0;
}
当我运行此代码时,“调用 CryptMsgUpdate 时”内存不断增加。我是不是分配错了?
我尝试使用Memory Leak Detection Enabling方法检测内存泄漏但没有出现:
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
and
_CrtDumpMemoryLeaks();
提前致谢
【问题讨论】:
-
只是一个疯狂的猜测,您不应该按照获取资源的相反顺序释放资源吗?也就是说,
CryptMsgClose应该出现在CryptReleaseContext之前。 -
你是说每次调用 memoryUP() 时你的内存使用量都会增加吗?如果您注释掉 CryptMsgUpdate() 调用会发生什么? - 每次你的内存都会增加吗?
-
为什么 CryptMsgClose(msg); 块被调用两次?
-
@Kerrek SB。相反的顺序有效,没有更多的内存了。谢谢。如何为你 +1?
-
@Nick Shaw,是的。如果我评论内存不起来。我以相反的顺序解决了它的分配问题。谢谢
标签: c++ visual-c++ memory-management