Постоянно увеличивает физическую память Visual C ++ CryptMsgClose и CryptReleaseContext - PullRequest
0 голосов
/ 18 августа 2011

Я использую 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".Неправильно ли я освободил?

Я пытался использовать Обнаружение утечки памяти Включение метода для обнаружения утечки памяти, но ничего не появляется:

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

and

_CrtDumpMemoryLeaks();

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 18 августа 2011

Вы должны высвободить ресурсы в порядке, обратном их приобретению:

 CryptAcquireContext();

 if (success)
 {
   CryptMsgOpenToDecode();

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

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

Более глубокие вложенные конструкции зависят от внешних и могут блокировать ресурсы, поэтому вы можете освободить необходимые ресурсы только после того, какМы выпустили зависимые.

Поскольку вы пометили этот C ++, я бы с упущением упомянул, что подобные вещи должны обрабатываться с помощью RIAA, и вы должны создать класс, который будет отвечать за ресурс.Как вы можете видеть даже в этом простом примере, написание правильных путей проверки ошибок очень быстро становится обременительным, поэтому было бы намного лучше и модульнее иметь класс, который очищается после себя, что автоматически происходит в правильном порядке.

0 голосов
/ 18 августа 2011

Я думаю, вам следует вызвать CryptMsgClose перед CryptReleaseContext.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...