c++ - 不断增加物理内存 Visual C++ CryptMsgClose 和 CryptReleaseContext

标签 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();

提前致谢

最佳答案

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

 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/

相关文章:

创建内存分配器时出现 C++ 继承错误

c++ - 使用 delete [] 运算符取消分配类中数据成员的内存

c++ - 如何找到 "real"错误?

c++ - 无法将 const 值发送到使用 operator[][] 的 operator+

c++ - 在发送数据之前压缩数据 - 控制字符?

c++ - 如何避免使用 R 值的悬空引用

c - 为什么这个 C 代码没有生成预期的输出?

c++ - 文件如何进入 Visual Studio C++ 中的外部依赖项?

objective-c - 我什么时候应该释放 [NSMutableDictionary 字典] 创建的字典?

c++ - Loki 和 C++11