2011-08-18 72 views
0

我使用C++和Visual Studio 2005增加物理内存不断的Visual C++ CryptMsgClose和CryptReleaseContext

我有一个项目,在一个非常不正常的内存增加。当调试代码时,我意识到有几个部分可以为它做出贡献。像这样,例如:

// 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(); 

感谢

+1

只是一个疯狂的猜测,你不应该以他们的收购逆向顺序释放资源吗?也就是说,'CryptMsgClose'应该在*'CryptReleaseContext'之前。 –

+0

你是说你每次调用memoryUP()时都会增加你的内存使用量吗?如果您注释掉CryptMsgUpdate()调用,会发生什么? - 你还记得每次增加的记忆吗? –

+0

为什么_CryptMsgClose(msg); _块被调用两次? –

回答

2

你必须释放的资源在其收购的相反顺序:

CryptAcquireContext(); 

if (success) 
{ 
    CryptMsgOpenToDecode(); 

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

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

深层嵌套结构依赖于外层结构,可能会锁定资源,因此只有在“已经发布了依赖的。

既然你标记了这个C++,那么我应该提到那些事情应该用RIAA来处理,你应该创建一个对资源负责的类。正如你在这个简单的例子中看到的那样,编写正确的错误检查路径很快变得繁重,所以它会更好,更模块化地拥有一个清理完毕的类,这个类会自动按照正确的顺序进行清理。

0

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

相关问题