【发布时间】:2018-03-17 23:46:19
【问题描述】:
我正在上入门级编程课程。我知道分段错误是由于沿途某处的内存存储错误造成的。我写的程序应该接受一个给我们的文件,这个文件是代码,包含解码它的指令,然后打印解码的消息。
我们有几个测试用例,我的代码运行其中一些,但不是最后一个。我今天第一次了解了用于调试的 GDB,并使用 backtrace full 来尝试找出错误的来源,但我不完全确定如何解释它给我的信息。
这是我写的代码。 **编辑出来的代码
当我进行回溯时,这是它告诉我的。
#2 0x0000000000401523 in main () at main.cpp:42
second = 61 '='
third = 72 'H'
msg = 0x606308
i = 8
chars = ""
first = 90 'Z'
numMess = 8
out = <incomplete type>
name = "input4.txt"
in = <incomplete type>
arr = "IJKLMNOPQRSTUVWXYZABCDEFGH"
我不知道回溯告诉我什么,我不确定如何处理这些信息来发现和修复我的错误。
【问题讨论】:
-
如果您使用
std::vector而不是new[ ],您将有机会在不使用 gdb 的情况下发现错误。而不是Messages *msg; msg = new Messages[numMess];,您可以这样做:std::vector<Messages> msg(numMess);,然后使用vector::at()来检测越界访问。 -
两者比较如何?我们之前没有在课堂上讨论过 std::vector。
-
请注意,i = 8 和 numMess = 8。
for循环在第三部分的条件下退出,只有第二部分。 -
@jgwentworth -- 向量使用相同的语法来访问元素 -- 它实际上与您现在发布的代码没有什么不同(除了声明)。然而
std::vector有附加 函数来测试越界访问。如果您改为使用at()而不是[ ],您将得到std::out_of_range异常,而不是seg 错误和gdb 堆栈跟踪。至于你的班级,如果他们正在教new []和delete []在 C++ 中创建动态数组,请找一位新老师。 -
@jgwentworth
for (chars; std::getline(in, chars); i < numMess)for循环中的“停止”条件是什么?或者保持该循环运行的条件是什么?鉴于这些信息,应该很容易看出事情是如何爆发的。如果文件中有 1000 行,而我是个恶作剧者,输入numMess为 10 怎么办?
标签: c++ debugging segmentation-fault gdb