函数调用中的段错误
Segfault in Function call
为什么下面的代码在使用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();
}
你在堆栈上分配了两个大数组。最大堆栈大小没有由c++标准定义(编译器选择自己的限制),但是超过这个最大值,就会出现问题。
应该在堆上分配大数组,这意味着std::vector
是比std::array
更好的选择(尽管您可以动态分配std::array
,如果您真的想要的话)。在没有阅读move-constructor之前,你当然不应该从函数返回这么大的数组。
这似乎是一个堆栈溢出。我的猜测是clang的默认堆栈大小与g++不同。尝试在两个链接器中手动设置堆栈大小为相同的大小。
相关文章:
- 为什么PyImport_ImportModule python 3.7.2 中出现段错误?
- 为什么在访问 vtkRenderWindow 的"交互器"变量时会发生段错误?
- 全局向量导致 C++ 程序结束时出现段错误
- 为什么重载运算符<<打印特征类成员会导致段错误?
- 更改条件段错误
- 使用 TTF_RenderText() 加载字体时获取段错误 TTF_OpenFontRW()
- 注册对对象工厂的调用会导致段错误
- pthread_create在构造函数段错误中
- Nanoflann发现邻居提出段错误
- C++ 中的构造函数、继承、堆栈、堆、this-pointer 和段错误
- 具有unique_ptr的 CRTP 会导致段错误
- 增强纤维work_stealing屏障会导致段错误
- 当我返回指向结构的指针向量时出现段错误
- C++为什么我的代码没有爆炸/段错误?
- Pthread段错误,使用指向main中变量的指针
- C++ 模板中的段错误
- 相当于Windows/MSVC上的段错误?
- 为什么我的 LLVM JIT 实现出现段错误?
- 为什么访问我的引用捕获变量会导致我的 lambda 函数出现段错误?
- 为什么自删除的全局 Vulkan 实例仅在添加层时才导致段错误?