传递由posix_memalign() - gcc和C ++ 11创建的有效指针时,free()挂起

时间:2014-01-13 23:21:50

标签: c++ gcc c++11 posix free

我需要分配16字节对齐的内存,而我可以告诉已接受的方法是posix_memalign(),使用man page作为参考(其他StackOverflow问题表明这是所以)。下面的代码被简化为排除不相关的部分(即其他平台),但我保留了一些上下文(sse只是命名空间):

#include <malloc.h>
#include <stdlib.h>
float* sse::alloc(unsigned int count)
{
    void* p;
    int r = posix_memalign(&p,16,sizeof(float)*count);
    if ( r == 0 )
        return (float*)p;
    /* else output error and exit(1) - has never failed */
    else exit(1);
}

void sse::free(float* p)
{
    free(p);
}

使用它的代码非常明显:

int main(int argc, char* argv[])
{
    const unsigned int total = 16000;
    float *array = sse::alloc(total), *arr2 = sse::alloc(total);
    /* null ptr checks */
    // ...
    sse::free(array); sse::free(arr2);
    return 0;
}

我已经注释掉了所有非基本代码来测试它,并确认它确实在free(p);上“挂起” - 当我在gdb中 Ctrl-C 时它会报告线。 valgrind中的行为没有区别,SSE代码(使用Intel内在函数)(代替...)成功运行。我一直在使用相当标准的选项进行编译:{{1​​}},并尝试了无/不优化,无调试和一些不必要的强制转换。有关我的系统的一些信息(请询问您是否想要更多):

  • uname -a:Linux(名称)3.12.3-1-ARCH#1 SMP PREEMPT(日期)x86_64 GNU / Linux
  • g ++ --version:4.8.2
  • gdb --version:7.6.1
  • valgrind --version:3.9.0

由于手册页明确指出-g -O3 -std=c++11是正确的函数,我感到非常难过,我宁愿避免编写一个使用new / delete和padding 15个字节的机制(原因很明显)。如果有一个我不知道的替代方案,我很乐意尝试。此外,有关这种挂起的潜在原因的信息可能证明是有用的,因为搜索这些术语中的一些特别困难(比搜索“堆栈溢出”更容易)。

1 个答案:

答案 0 :(得分:14)

你需要调用全局免费 - 将自由例程更改为:

void sse::free(float* p)
{
    ::free(p);
}

命名空间规则会导致它调用sse::free,除非另有说明