Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Очистка переменных


Автор: Baddie 11.11.2009, 21:10
Если я написал следующию функцию :
Код
string ErrorMsg() { 
    // Retrieve the system error message for the last-error code

    LPVOID lpMsgBuf;
    LPVOID lpDisplayBuf;
    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | 
        FORMAT_MESSAGE_FROM_SYSTEM |
        FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL,
        GetLastError(),
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPTSTR) &lpMsgBuf,
        0, NULL );
    return (LPTSTR)lpMsgBuf; 
}
Должен ли я вызове этой функции удалять переменную использую LocalFree(lpMsgBuf) или компилятор будет это делать автоматически?



Модератор: не забываем пользоваться кнопочкой "Код"

Автор: Pitlord 11.11.2009, 21:20
Baddie, я так понимаю, Вы должны освободить эту переменную после вызова ErrorMsg()

Цитата(Baddie @  11.11.2009,  21:10 Найти цитируемый пост)
(LPTSTR) &lpMsgBuf

По-моему, это уже указатель на указатель, нет?

Автор: Abyx 11.11.2009, 22:03
Baddie, прочитай про флаг FORMAT_MESSAGE_ALLOCATE_BUFFER

Автор: Andrey44 12.11.2009, 08:04
В MSDN есть замечательный пример
Код

#include <windows.h>
#include <strsafe.h>

void ErrorExit(LPTSTR lpszFunction) 

    // Retrieve the system error message for the last-error code

    LPVOID lpMsgBuf;
    LPVOID lpDisplayBuf;
    DWORD dw = GetLastError(); 

    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | 
        FORMAT_MESSAGE_FROM_SYSTEM |
        FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL,
        dw,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPTSTR) &lpMsgBuf,
        0, NULL );

    // Display the error message and exit the process

    lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, 
        (lstrlen((LPCTSTR)lpMsgBuf)+lstrlen((LPCTSTR)lpszFunction)+40)*sizeof(TCHAR)); 
    StringCchPrintf((LPTSTR)lpDisplayBuf, 
        LocalSize(lpDisplayBuf),
        TEXT("%s failed with error %d: %s"), 
        lpszFunction, dw, lpMsgBuf); 
    MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK); 

    LocalFree(lpMsgBuf);
    LocalFree(lpDisplayBuf);
    ExitProcess(dw); 
}

void main()
{
    // Generate an error

    if(!GetProcessId(NULL))
        ErrorExit(TEXT("GetProcessId"));
}


Автор: 586 12.11.2009, 09:04
Код
string ErrorMsg() { 
    string s;
    LPVOID lpMsgBuf = 0;
    //LPVOID lpDisplayBuf;
    if(FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | 
        FORMAT_MESSAGE_FROM_SYSTEM |
        FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL,
        GetLastError(),
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPTSTR) &lpMsgBuf,
        0, NULL ) && lpMsgBuf != 0)
    {
        s = (LPCSTR)lpMsgBuf; 
        LocalFree(lpMsgBuf);
    }
    return s;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)