尝试输出对象函数时C ++分段错误

时间:2009-11-18 01:43:09

标签: c++ arrays segmentation-fault

我正在尝试输出共享基类的一组对象共有的函数,我遇到了一些困难。实例化对象时,它们存储在一个数组中,然后我尝试使用以下代码来执行此循环中所有对象的通用功能:

  if ( truck <= v ) // all types of trucks

vptr是一个对象数组,循环中的函数对所有对象都是通用的。代码编译得很好但是当我运行它时,它进入这个循环时会出现分段错误。我非常有信心在这个循环中对第一个函数的调用是导致问题的原因。

这就是我在前一个循环中实例化对象的方法:

        vptr[ i ] = new Vehicle( sn, pc );

我还应该提一下,对不起,我从一开始就忘了清楚,在这个数组中,每个对象都属于不同的类。它们都共享一个基类,但它们是该类的派生对象。很抱歉忘记了可能很重要的信息。

感谢 NMR

2 个答案:

答案 0 :(得分:6)

如果对象不是指定类型,则指针类型的

dynamic_cast返回空指针(aka 0NULL)。您必须在使用之前检查指针,或使用引用类型(而不是throws an exception on failure):

if (Truck* p = dyanmic_cast<Truck*>(vptr[i])) {
  // use the pointer here
}
else {
  // vptr[i] doesn't point to a Truck
}

(注意正确键入的指针对你来说效果很好,在你可以提高可读性的时候利用这个。)

答案 1 :(得分:1)

如果您使用调试器,您可以轻松找出导致分段错误的调用,甚至检查内存以查看是否有空指针等。

GCC与GDB就是一个很好的例子。试试这个 - 首先使用调试信息构建你的应用程序(为此你将-g开关添加到你的编译器):

gcc -g test.c -o myProgramName

现在启动GDB:

gdb myProgramName

在第一个GDB提示符下,输入'r'命令运行程序:

(gdb) r

然后,当你到达segfault时,使用'bt'命令查看堆栈跟踪并找出程序在内存访问不良时的位置:

Program received signal SIGSEGV, Segmentation fault.
0x08048380 in testFunction2 () at test.c:17
17      *test = 1;
(gdb) bt
#0  0x08048380 in testFunction2 () at test.c:17
#1  0x0804836e in testFunction1 () at test.c:10
#2  0x0804835a in main () at test.c:5

在启用调试的情况下编译时,它可以让您查看导致崩溃的源文件,行号和实际代码。学习使用调试器可以很容易地找到分段错误。

调试器还允许你检查内存 - 通过上面的例子,我可以检查'test'指针的值:

(gdb) print test
$1 = 0x0

哎呀,当我试图更改它引用的内存时指针为NULL,因此我正在访问内存,我的程序不允许触摸,导致分段错误。

尝试使用带有对象的'print'命令 - GDB足够聪明,可以实际打破对象,并向您显示每个对象成员的值。此外,您可以在调试程序时使用'printf'命令打印字符串等。

希望这有帮助, 诗