-2

我在 MVS 中创建了实现而不使用 CRT。我使用HeapAlloc()andHeapFree()来分配内存。我的示例应该可以在没有内存泄漏的情况下工作。
这是我的代码:

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()程序突然崩溃。什么?

4

1 回答 1

1

看着HeapFree

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

内存

指向要释放的内存块的指针。该指针由HeapAllocorHeapReAlloc函数返回。如果此指针为 NULL,则行为未定义。


在代码中

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

您没有分配指向 的指针HeapFree,而是指向一些不相关(非堆)内存的地址的指针。


正确的电话是

HeapFree(GetProcessHeap(), NULL, datas);

或者

HeapFree(GetProcessHeap(), NULL, buffer);
于 2020-02-15T08:47:18.630 回答