【问题标题】:Increases physical memory continuously Visual C++ CryptMsgClose and CryptReleaseContext不断增加物理内存 Visual C++ CryptMsgClose 和 CryptReleaseContext
【发布时间】: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


【解决方案1】:

您必须按照获取资源的相反顺序释放资源:

 CryptAcquireContext();

 if (success)
 {
   CryptMsgOpenToDecode();

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

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

更深的嵌套结构依赖于外部的结构,可能会锁定资源,所以你只能在释放依赖的资源之后释放必备资源。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-01
      • 2018-05-21
      • 2014-11-13
      • 2014-06-14
      相关资源
      最近更新 更多