我有点担心 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、g++),行为是相同的。如果我用 malloc() 替换 posix_memalign(),行为是相同的。
知道发生了什么事吗?谢谢!
我使用的是 Linux 3.2.0/x86_64 (Ubuntu) 和 gcc 4.6.3。
最佳答案
这种行为是完全有效的,您的代码不应依赖于以任何特定模式分配的内存。
归结为分配函数的内部实现细节,但一种可能的解释是:
free
函数查看分配给进程的内存量与实际使用量的对比,以确定是否应释放一些内存(供其他进程使用)。- 在进行该分析的过程中,
free
更改了分配器使用的一些内部状态变量,即使实际上没有释放任何内存也是如此。 - 因此, future 调用分配函数的行为与未调用
free
时不同。
关于c++ - posix_memalign/malloc 在第一次调用 free 后分配较低的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27461430/