c++ - posix_memalign/malloc 在第一次调用 free 后分配较低的地址

标签 c++ c

我有点担心 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/

相关文章:

c - 霍夫曼编码、保存代码和用 C 编写二进制文件

c++ - 如何将此动态链接库链接到程序?

c++ - 将 IplImage * 传递给函数,原始文件没有得到更新

c - 使用 50% cpu 的简单 C 应用程序

c - Spin Loop 在缓存一致性方面的开销

c++ - 复制数组会修改使用原始数组的函数的行为

c++ - cpp字节文件读取

c++ - 如何从字节数组中读取 8 位位图像素颜色和位置

c++ - 哪个是更专业的模板功能? clang 和 g++ 对此有所不同

c - siginfo 中的数据可信吗?