连续增加物理内存Visual C ++ CryptMsgClose和CryptReleaseContext

时间:2011-08-18 13:03:07

标签: c++ visual-c++ memory-management

我正在使用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();

先谢谢

2 个答案:

答案 0 :(得分:2)

您必须按照获取的相反顺序发布资源:

 CryptAcquireContext();

 if (success)
 {
   CryptMsgOpenToDecode();

   if (success)
   {
      CryptMsgClose();
   }
   // else: nothing to close, opening failed

   CryptReleaseContext();
 }
 // else: nothing to release, acquisition failed

更深层次的嵌套构造取决于外层构造,并且可能会锁定资源,因此您只能在释放依赖资源后释放必备资源。

由于你标记了这个C ++,我会疏忽提到应该用RIAA处理那些事情,你应该创建一个负责资源的类。正如您在这个简单的示例中所看到的那样,快速编写正确的错误检查路径变得繁重,因此拥有一个可以自行清理的类会更好,更模块化,这会自动以正确的顺序发生。 / p>

答案 1 :(得分:0)

我认为你应该在CryptReleaseContext之前调用CryptMsgClose。