Почему HeapFree () не работает должным образом? - PullRequest
0 голосов
/ 15 февраля 2020

Я создал реализацию в MVS без использования CRT. Я использую HeapAlloc() и HeapFree() для выделения памяти. Мой пример должен работать без утечки памяти.
Вот мой код:

LPCSTR byte2ch(BYTE* data, int size) {
    char* datas = (char*)HeapAlloc(GetProcessHeap(), NULL, size);
    LPCSTR temp = (reinterpret_cast<char const*>(data));
    for (int i = 0; i < size; i++) {
        datas[i] = temp[i];
    }
    LPSTR tempo = datas;
    HeapFree(GetProcessHeap(), NULL, (LPVOID)&size);
    return tempo;
}

int EntryPoint()
{
    BYTE* buffer = 0;

    HANDLE hFile;
    DWORD dwBytesRead, dwBytesWritten, dwPos;

    if (hFile = CreateFileW(L"MinerFinder.exe", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, 0, NULL))
    {
        LARGE_INTEGER size;
        GetFileSizeEx(hFile, &size);

        buffer = (BYTE*)HeapAlloc(GetProcessHeap(), NULL, size.QuadPart);
        ReadFile(hFile, buffer, size.QuadPart, &dwBytesRead, NULL);

        MessageBoxA(NULL, byte2ch(buffer, size.QuadPart), NULL, SW_SHOW);
        HeapFree(GetProcessHeap(), NULL, (LPVOID)&size.QuadPart);
        MessageBoxA(NULL, "", NULL, SW_SHOW); // there I can see, that memory is leaking...
        CloseHandle(hFile);
    }

    ExitProcess(0);
}  

Где моя ошибка?

РЕДАКТИРОВАТЬ 1:

LPCSTR byte2ch(BYTE* data, int size) {
        char* datas = (char*)HeapAlloc(GetProcessHeap(), NULL, size);
        LPCSTR temp = (reinterpret_cast<char const*>(data));
        for (int i = 0; i < size; i++) {
            datas[i] = temp[i];
        }
        LPSTR tempo = datas;
        HeapFree(GetProcessHeap(), NULL, datas);
        return tempo;
    }

там, когда У меня HeapFree() программа неожиданно вылетает. Что?

1 Ответ

1 голос
/ 15 февраля 2020

Просмотр HeapFree

BOOL HeapFree (HANDLE hHeap, DWORD dwFlags, _Frees_ptr_opt_ LPVOID lpMem);

lpMem

Указатель на освобождаемый блок памяти. Этот указатель возвращается функцией HeapAlloc или HeapReAlloc . Если этот указатель равен NULL, поведение не определено.


В коде

HeapFree(GetProcessHeap(), NULL, (LPVOID)&size);
HeapFree(GetProcessHeap(), NULL, (LPVOID)&size.QuadPart);

Вы не назначаете выделенный указатель на HeapFree, но указатель на адрес некоторой несвязанной (не кучи) памяти.


Правильный вызов будет

HeapFree(GetProcessHeap(), NULL, datas);

или

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