我有点担心posix_memalign()和malloc()在我的系统上的行为。我有以下的测试代码:posix_memalign/malloc在第一次免费拨打电话后分配较低地址
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int
main()
{
int i;
float *data;
for (i = 0; i < 5; i++) {
assert(!posix_memalign((void**) &data, 16, 100000 * sizeof(float)));
printf("data = %p\n", data);
}
free(data);
for (i = 0; i < 5; i++) {
assert(!posix_memalign((void**) &data, 16, 100000 * sizeof(float)));
printf("data = %p\n", data);
}
return 0;
}
在第一5次分配,posix_memalign()返回高电平地址。后我调用free(),它突然切换到低地址:
% ./aligned
data = 0x7f74f9974010
data = 0x7f74f9912010
data = 0x7f74f98b0010
data = 0x7f74f984e010
data = 0x7f74f93c4010
data = 0x929010
data = 0x98aaa0
data = 0x9ec530
data = 0xa4dfc0
data = 0xaafa50
的行为是相同的,如果我编译成C程序(.C,GCC)和作为C++程序(.C,克++ )。如果我用malloc()替换posix_memalign(),行为是一样的。
任何想法是怎么回事?谢谢!
我使用Linux 3.2.0/x86_64(Ubuntu)和gcc 4.6.3。
您是否认为实际上释放了所有的分配,而不仅仅是最后一个?而且绝对不能保证分配与其他分配有任何特定的顺序或特定的地点。 – 2014-12-13 17:15:52
@MatsPetersson:在这种情况下(posix_memalign(),然后立即释放())切换到低地址也发生在第一次空闲后。 – Ralf 2014-12-13 17:21:22
这会回答这个问题:http://stackoverflow.com/questions/1119134/how-do-malloc-and-free-work? – noxmetus 2014-12-13 17:33:10