c++ - HeapSetInformation 返回 ERROR_INVALID_PARAMETER

标签 c++ memory-management

我使用 visual studio 2008 service pack1(9.0.30729.1)、windows 7 professional 64 位和 8 GB 内存运行我的应用程序

我的应用程序是 32 位进程并使用/LARGEADDRESSAWARE 选项

为了减少内存碎片,我调整了示例代码 ( http://msdn.microsoft.com/en-us/library/windows/desktop/aa366705(v=vs.85).aspx )

#include <windows.h>
#include <tchar.h>
#include <stdio.h>

#define HEAP_LFH 2

int __cdecl _tmain()
{
    BOOL bResult;
    HANDLE hHeap;
    ULONG HeapInformation;

    //
    // Enable heap terminate-on-corruption. 
    // A correct application can continue to run even if this call fails, 
    // so it is safe to ignore the return value and call the function as follows:
    // (void)HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0);
    // If the application requires heap terminate-on-corruption to be enabled, 
    // check the return value and exit on failure as shown in this example.
    //
    bResult = HeapSetInformation(NULL,
                                 HeapEnableTerminationOnCorruption,
                                 NULL,
                                 0);

    if (bResult != FALSE) {
        _tprintf(TEXT("Heap terminate-on-corruption has been enabled.\n"));
    }
    else {
        _tprintf(TEXT("Failed to enable heap terminate-on-corruption with LastError %d.\n"),
                 GetLastError());
        return 1;
    }

    //
    // Create a new heap with default parameters.
    //
    hHeap = HeapCreate(0, 0, 0);
    if (hHeap == NULL) {
        _tprintf(TEXT("Failed to create a new heap with LastError %d.\n"),
                 GetLastError());
        return 1;
    }

    //
    // Enable the low-fragmenation heap (LFH). Starting with Windows Vista, 
    // the LFH is enabled by default but this call does not cause an error.
    //
    HeapInformation = HEAP_LFH;
    bResult = HeapSetInformation(hHeap,
                                 HeapCompatibilityInformation,
                                 &HeapInformation,
                                 sizeof(HeapInformation));
    if (bResult != FALSE) {
        _tprintf(TEXT("The low-fragmentation heap has been enabled.\n"));
    }
    else {
        _tprintf(TEXT("Failed to enable the low-fragmentation heap with LastError %d.\n"),
                 GetLastError());
        return 1;
    }

    return 0;
}

bResult = HeapSetInformation(hHeap, 堆兼容性信息, &堆信息, sizeof(堆信息));

bResult 为 false,getLastError 为 87(ERROR_INVALID_PARAMETER)

如何解决这个问题?

最佳答案

The LFH also cannot be enabled if you are using the heap debugging tools in Debugging Tools for Windows or Microsoft Application Verifier.

在 VS2010 调试器下运行链接的示例代码对我来说产生了完全相同的失败。在不调试的情况下运行 (Ctrl-F5),它按预期成功。

但是,来自同一篇文章:

The information in this topic applies to Windows Server 2003 and Windows XP. Starting with Windows Vista, the system uses the low-fragmentation heap (LFH) as needed to service memory allocation requests. Applications do not need to enable the LFH for their heaps.

所以基本上,最好的解决办法是根本不这样做

如果您真的、真的、真的必须特别支持 XP/2k3,即使它们的终结迫在眉睫;

To enable the low-fragmentation heap when running under a debugger, set the _NO_DEBUG_HEAP environment variable to 1.

关于c++ - HeapSetInformation 返回 ERROR_INVALID_PARAMETER,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20894473/

相关文章:

c++ - static_cast 与直接调用转换运算符?

c++ - C++继承与虚函数问题

objective-c - iOS - XML 解析内存泄漏

python - Celery - 最小化内存消耗

python-3.x - 如何使用 TensorFlow 正确管理内存和批量大小

c++ - 静态变量访问

c++ - 错误 : more than one instance of overloaded function matches argument list

c++ - 识别矩阵变量分配的行为

java - iText 内存管理 - PdfReader/Watermarking 加载过多

c - 为什么在将二维数组传递给 C 函数时必须提供维度?