函数调用中的段错误

Posted

技术标签:

【中文标题】函数调用中的段错误【英文标题】:Segfault in Function call 【发布时间】:2014-06-02 22:15:14 【问题描述】:

为什么以下代码在使用 gcc 编译时运行良好,但在使用 clang (3.4) 编译时出现段错误。如果删除了明显多余的 Thread 对象,则代码运行良好。此外,如果任何数组变小,代码运行良好。

#include <array>
#include <emmintrin.h>

class Thread 
public:
    std::array<__m128i,  16 * 3 * 3 * 1280> m_BlockTypes;
    unsigned int  m_SeedIdx1[16 * 16 * 3 * 3 * 512];
;

class BroadcastImpl

    public: 
    std::array<__m128i, 16 * 3  * 3 * 256> Evaluate()
    
        return std::array<__m128i, 16 * 3  * 3 * 256>();
    
;


int main(int argc, char** argv) 
    Thread thread;
    (void)(thread);
    BroadcastImpl().Evaluate();
    BroadcastImpl().Evaluate();

【问题讨论】:

【参考方案1】:

嗯,你在堆栈上分配了两个巨大的数组。最大堆栈大小不是由 C++ 标准定义的(编译器在那里选择自己的限制),但是超过这个最大值,东西就会坏掉。

应该在堆上分配大数组,这意味着std::vector 是比std::array 更好的选择(尽管如果你真的想动态分配std::array)。而且你当然不应该在没有阅读移动构造函数的情况下从函数返回那个大小的数组。

【讨论】:

是的,我没有计算尺寸。不知怎的,我脑子里想着它们不到 1MB【参考方案2】:

这似乎是堆栈溢出。我的猜测是 clang 的默认堆栈大小与 g++ 的不同。尝试在两个链接器中手动将堆栈大小设置为相同的大小。

【讨论】:

以上是关于函数调用中的段错误的主要内容,如果未能解决你的问题,请参考以下文章

C中多线程python扩展中的段错误

推送到成员向量时的段错误

c++ 类向量中的段错误

调用 glDrawElements 时的段错误

请教ccs上如何使用file操作函数,heap应该如何设置

STL容器作为函数中的模板参数,调用错误