初始化 std::vector<double> 时出现分段错误
Segmentation fault when initializing a std::vector<double>
以下行出现段错误的可能原因是什么?
std::vector<double> d(8);
What are the possible causes of a segmentation fault at the following line?
该行本身极不可能导致分段错误。唯一可能发生的情况是你用尽了堆栈。做 (gdb) x/i $pc
。崩溃指令是 PUSH
还是 CALL
?如果是这样,可能是堆栈耗尽的原因。
如果代码经过优化编译,并且崩溃的指令是 MOVDQA
或类似的指令,则可能是堆栈未对齐的原因:堆栈中的某些代码未在 16 字节边界上对齐堆栈,根据当前 ABI 的要求。您是否链接了一些非常古老的档案库?您正在使用 -mpreferred-stack-boundary=2
或 1
构建一些代码吗?坏主意!
如果(更有可能)崩溃没有真的发生在该行,而是在一些名为from的代码中行,特别是如果被调用的代码在 malloc
内,那么之前的堆损坏很可能是原因。
要找到它,请使用 Valgrind 或 Address Sanitizer。
以下行出现段错误的可能原因是什么?
std::vector<double> d(8);
What are the possible causes of a segmentation fault at the following line?
该行本身极不可能导致分段错误。唯一可能发生的情况是你用尽了堆栈。做 (gdb) x/i $pc
。崩溃指令是 PUSH
还是 CALL
?如果是这样,可能是堆栈耗尽的原因。
如果代码经过优化编译,并且崩溃的指令是 MOVDQA
或类似的指令,则可能是堆栈未对齐的原因:堆栈中的某些代码未在 16 字节边界上对齐堆栈,根据当前 ABI 的要求。您是否链接了一些非常古老的档案库?您正在使用 -mpreferred-stack-boundary=2
或 1
构建一些代码吗?坏主意!
如果(更有可能)崩溃没有真的发生在该行,而是在一些名为from的代码中行,特别是如果被调用的代码在 malloc
内,那么之前的堆损坏很可能是原因。
要找到它,请使用 Valgrind 或 Address Sanitizer。