_com_error :: ErrorMessage приведет к утечке памяти? - PullRequest
0 голосов
/ 30 сентября 2019

Я пытаюсь использовать VC ++ и ADO для подключения к SQL Server. И используйте C ++ Memory Validator, чтобы проверить, есть ли утечки памяти. Ниже приведены мои коды:

    ADODB::_ConnectionPtr  Conn1;

    CoInitialize(NULL);

    // Trap any error/exception.
    try
    {
        // Create and Open Connection Object.
        Conn1.CreateInstance( __uuidof( ADODB::Connection) );
        Conn1->ConnectionString = _bstr_t(L"Provider=sqloledb;Data Source=MYPC;Integrated Security=SSPI;");
        Conn1->Open( _bstr_t(L""), _bstr_t(L""), _bstr_t(L""), -1 );
        Conn1->Execute(_bstr_t(_T("DROP TABLE UnexistingTable;")), NULL, ADODB::adCmdText | ADODB::adExecuteNoRecords);
        Conn1->Close();
    }
    catch(_com_error& e) 
    {
        CString strError = e.ErrorMessage();
    }

    CoUninitialize();

Валидатор памяти C ++ сообщит о следующей утечке памяти, вызванной _com_error :: ErrorMessage ():

memory leak reported by C++ Memory Validator

Но я проверяю документ на ErrorMessage, и он говорит:

Возвращаемая строка выделяется API-интерфейсом FormatMessage и освобождается при уничтожении объекта _com_error.

Так что, похоже, с моими кодами все в порядке. Я пытаюсь поставить точку останова в деструкторе _com_error :: ~ _com_error, но VS сказал, что не может поставить точку останова из-за оптимизации кода. Поэтому я не могу знать, было ли сообщение успешно выпущено или нет.

...