0

好吧,我放弃了。我究竟做错了什么?我有一个简单的 Windows C 控制台应用程序可以执行此操作:

int buflen = 10;
PUCHAR ptr = LocalAlloc(LPTR, buflen);  // returns valid address
buflen = 20;
ptr = LocalReAlloc(ptr, buflen, 0); // returns NULL with GetLastError() = 8

我也试过这个,结果相同:

ptr = LocalReAlloc(ptr, buflen, LPTR);

关于LocalReAlloc,我需要知道一些秘密吗?

谢谢。

4

1 回答 1

4

与您LocalAlloc一起传递LMEM_FIXED标志(它包含在 中LMEM_PTR)。因为那样LocalReAlloc 只能在原地重新分配内存:

如果内存是锁定的 LMEM_MOVEABLE 内存块或 LMEM_FIXED 内存块且未指定此标志,则只能就地重新分配内存。

这意味着LocalReAlloc不允许更改它返回的指针的值。如果本地堆在现有指针旁边有空闲内存,它可以扩展分配。因为内存是固定的,所以不能分配新的块。

因此,在您的情况下LocalReAlloc,无法重新分配并返回最佳错误,即 8 - ERROR_NOT_ENOUGH_MEMORY。

那么解决方案是什么?不要使用 LocalAlloc!它只存在于 Win16 和一些旧的 API 支持。使用没有这个问题的 malloc()/realloc()。

于 2013-04-26T20:38:49.497 回答