1 c++ iostream segmentation-fault
当我在循环中将每个元素设置为 0 或 Entry_count-1 时,它就会起作用。当我将其设置为较小的entry_count,并且我用手而不是循环编写它时(sorted_order[0] = 0;sorted_order[1] = 1;...等),它就可以工作。
请不要告诉我如何修复我的代码。出于非常具体的原因,我不会使用智能指针或向量。相反,请关注以下问题:什么样的条件会导致此段错误?谢谢。
- - 老的 - - -
我正在尝试调试无法在 UNIX 机器上运行的代码。代码的要点是:
int *sorted_array = (int*)memory;
// I know that this block is large enough
// It is allocated by malloc earlier
for (int i = 0; i < entry_count; ++i){
sorted_array[i] = i;
}
Run Code Online (Sandbox Code Playgroud)
循环中的某个地方似乎存在段错误。不幸的是,切换到调试模式会使段错误停止。使用cout调试我发现它一定是在循环中。
接下来我想知道段错误发生在循环中多远,所以我添加了:
std::cout << i << '\n';
Run Code Online (Sandbox Code Playgroud)
它显示了它应该循环的整个范围,并且没有段错误。
经过更多的实验,我最终在循环之前创建了一个字符串流,并为循环的每次迭代写入一个空字符串,并且没有段错误。
我尝试了一些其他各种操作试图弄清楚发生了什么。我尝试设置变量 j = i; 诸如此类的东西,但我还没有找到任何有效的东西。
运行 valgrind 我得到的有关段错误的唯一信息是它是“一般保护错误”以及有关对 11 的默认响应的信息。它还提到有一个条件跳转或移动取决于未初始化的值,但查看代码我不明白这是怎么可能的。
这可能是什么?我没有想法去探索。
这显然是程序中无效内存使用的症状。通过查看代码片段很难发现这一点,因为它很可能是已经发生的其他不良情况的副作用。
然而,正如您在问题中提到的,您可以使用Valgrind 附加您的程序。因为它是可重现的。所以你可能想附上你的程序(a.out)。
$ valgrind --tool=memcheck --db-attach=yes ./a.out
这样,当检测到第一个内存错误时,Valgrind 会将您的程序附加到调试器中,以便您可以进行实时调试(GDB)。这应该是理解和解决您的问题的最佳方式。
一旦您能够找出第一个错误,请修复它并重新运行它,然后查看您遇到的其他错误。应该执行此步骤,直到 Valgrind 报告没有错误为止。
但是,您应该避免在现代 C++ 程序中使用原始指针,并std::vector std::unique_ptr按照其他人的建议开始使用。
| 归档时间: |
|
| 查看次数: |
19639 次 |
| 最近记录: |