我正在使用 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();
提前致谢
最佳答案
您必须按照获取资源的相反顺序释放资源:
CryptAcquireContext();
if (success)
{
CryptMsgOpenToDecode();
if (success)
{
CryptMsgClose();
}
// else: nothing to close, opening failed
CryptReleaseContext();
}
// else: nothing to release, acquisition failed
越深的嵌套结构依赖于最外层的,可能会锁住资源,所以只有在释放了依赖的资源后,才能释放先决条件的资源。
既然你标记了这个 C++,我会失职地提到那些事情应该用 RIAA 来处理,你应该创建一个负责资源的类。即使在这个简单的示例中,您也可以看到,编写正确的错误检查路径很快就会变得繁重,因此最好有一个可以自行清理的类,它会以正确的顺序自动发生。
关于c++ - 不断增加物理内存 Visual C++ CryptMsgClose 和 CryptReleaseContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7107832/