【发布时间】:2011-11-20 18:59:30
【问题描述】:
我在涉及 realloc 的 clang 代码中遇到了问题。这段代码在 gcc 和 Visual Studio 下运行良好,所以我有兴趣了解 clang 的行为。我们的代码执行与此类似的操作(省略了错误处理等):
// allocate way more memory than we need
char * memory = malloc(500000);
int memoryused = 0;
// ... code goes here that fills up the memory, keeping track by
// setting memoryused ...
// now we're done, shrink the memory down to the size it needs
memory = realloc(memory, memoryused);
在 gcc 和多个版本的 MSVC 下,内存指针没有移动。但是,在clang下,它似乎移动了内存,即使所需的大小只有1-2000字节。
clang 这样做有什么特别的原因吗?我能想到的唯一一个可能是它为大小分配或其他东西保留了单独的堆。否则,移动内存似乎有点低效,因为它可以截断旧的内存块并继续使用它而无需复制数据。
【问题讨论】:
-
顺便说一句,你这样做是个坏主意。您应该始终假设对
realloc的调用都可以返回不同的地址并且失败(返回NULL),即使是减少,因为这是标准所说的。其他任何事情都只是草率的编码(无意冒犯),并且您的收缩操作是潜在的内存泄漏,除非您已将memory保存在某处以进行恢复。有关血腥细节,另请参阅stackoverflow.com/questions/3162502/…。 -
是的,我在遇到这个问题后想通了。让我感到奇怪的是,它在除叮当声之外的所有其他东西上都可以正常工作。 :)
标签: c macos osx-lion clang realloc