idc*_*man 3 c heap winapi memory-management realloc
我正在使用win32 API在C中编写应用程序.当我尝试使用HeapRealloc()函数扩大数组的大小时,它会更改数组中的当前值,而不是复制它们.我用来重新分配内存的代码:
BOOL ChangeFeedArraySize(UINT newSize)
{
char tempChar[20] = "";
PFEED tempArr;
if (newSize == 1)
{
tempArr = (PFEED)HeapAlloc(heap, HEAP_ZERO_MEMORY, sizeof(FEED));
}
else
{
tempArr = (PFEED)HeapReAlloc(heap, HEAP_ZERO_MEMORY, categoryArray, newSize * sizeof(FEED));
// FEED - a struct
// PFEED - a pointer to the struct
// categoryArray - array to be reallocated
}
if (tempArr != NULL)
{
MessageBox(NULL, ltoa(HeapSize(heap, 0, tempArr),tempChar,10) , "Heap size after reallocation", MB_OK | MB_ICONEXCLAMATION);
feedArray = tempArr;
return TRUE;
}
else
{
return FALSE;
}
}
Run Code Online (Sandbox Code Playgroud)
这是在断点处的数组的状态.feed数组显示当前的数组状态.temp数组显示新的重新分配的数组状态(不同).
饲料数组:
feedArray http://www.freeimagehosting.net/uploads/526b0b2172.jpg
临时数组:
tempArray http://www.freeimagehosting.net/uploads/17858f2e7e.jpg
请帮忙.. :\
链接到MSDN上的功能描述
您引用了Windows特定的功能,但这也是realloc()标准的等效功能.
如果这些函数返回与传入的地址相同的地址,那是因为您最初请求的缓冲区之后的内存未使用.因此它可以在不移动缓冲区的情况下满足请求.
但是,例如,如果有两个快速分配,那会怎样呢?也许在最初请求之后的内存最终被用于下一次分配.在这种情况下,分配器需要在其他地方找到空间,复制旧缓冲区中的内容,释放旧缓冲区,然后返回新缓冲区.
一般来说,你想要遵循这种事情的模式是这样的:
void *newmem = realloc(oldmem, newsize);
if (!newmem)
{
// TODO: handle failure
// possibly free(oldmem); depending on how you want to handle errors
}
else
{
oldmem = newmem;
}
Run Code Online (Sandbox Code Playgroud)
人们采用的一种常见捷径是" oldmem = realloc(oldmem, newsize);",但这并不像上面那样优雅,因为它oldmem在发生故障时会泄漏.
根据您的修改进行更新:
我在你的代码中想知道的一件事是这部分:
if (newSize == 1)
{
tempArr = (PFEED)HeapAlloc(heap, HEAP_ZERO_MEMORY, sizeof(FEED));
}
Run Code Online (Sandbox Code Playgroud)
这似乎假设第一次分配总是大小为1.你确定你不是故意说if (feedArray == NULL),然后分配newSize * sizeof(FEED)?
第二次更新:
好.另一件突出的是:
tempArr = (PFEED)HeapReAlloc(heap, HEAP_ZERO_MEMORY, categoryArray,
newSize * sizeof(FEED));
// Snip...
if (tempArr != NULL)
{
// Snip...
feedArray = tempArr;
粗体部分应该相同.
| 归档时间: |
|
| 查看次数: |
1626 次 |
| 最近记录: |