C++ 调用对象指针的虚拟函数导致的段错误
我想为基于C++ 调用对象指针的虚拟函数导致的段错误,c++,embedded,segmentation-fault,virtual,mips,C++,Embedded,Segmentation Fault,Virtual,Mips,我想为基于MIPS的嵌入式设备开发一个应用程序。我正在使用mipsel-elf-g++交叉编译器。我实现了一个简单的代码,如下所示 A类{ 公众: 虚拟int getValue(); } B类:公共A{ 公众: 虚拟int getValue(); } inta::getValue(){ 返回1; } intb::getValue(){ 返回2; } int main(){ A a1; B b1; A*a2=&a1; B*b2=&b1; int a_val_1=a1.getValue(); int
MIPS
的嵌入式设备开发一个应用程序。我正在使用mipsel-elf-g++
交叉编译器。我实现了一个简单的代码,如下所示
A类{
公众:
虚拟int getValue();
}
B类:公共A{
公众:
虚拟int getValue();
}
inta::getValue(){
返回1;
}
intb::getValue(){
返回2;
}
int main(){
A a1;
B b1;
A*a2=&a1;
B*b2=&b1;
int a_val_1=a1.getValue();
int b_val_1=b1.getValue();
int a_val_2=a2->getValue();
int b_val_2=b2->getValue();
返回0;
}
a1.getValue()
和b1.getValue()
行成功运行,但当执行a2->getValue()
或b2->getValue()
行时,我会在屏幕上看到段故障
消息。我认为其中一个操作系统、编译器或库可能已损坏。我不知道怎样才能找到问题
怎么了?您有:
B b1;
您正在分配:
B* b2 = &b2;
应该是:
B* b2 = &b1;
是的,但它不应该像现在这样编译。你是对的,这是我在问题上的错误。我编辑我的问题。你是什么意思?你的意思是“在初始化过程中无法将‘B**’转换为‘B*’”吗?如果在你的问题B*b2=&b1中,因为你打错了,那么代码中没有任何错误。它会起作用的。@PrasanthMadhavan:问题就在这里。我的代码不能正常工作。如果getValue
函数定义为无虚拟函数
,则工作正常,但如果是virtaul
则出现段错误
错误。您应该创建一个最小的工作示例,并将该示例复制到问题中,而不是键入类似的内容。目前的代码存在语法错误,表明存在另一个键入错误(您已经更正了一个),并且更正语法会生成一个有效的程序,该程序不应显示所显示的行为,这似乎表明至少还有一个其他差异是代码。更正类定义上缺少的“;”s后,当使用MIPS-linux-gnu-g++
@markgz编译时,代码在MIPS系统上运行良好:mipsel-elf-g++
和MIPS-linux-gnu-g++
之间有什么不同?我的嵌入式设备操作系统不是linux。我是否可以使用mips-linux-gnu-g++
而不是mipsel-elf-g++
?如果您的系统未使用linux,则无法使用mips-linux-gnu-g++
。但是,两个版本的g++都基于相同的源代码,因此两个工具都会出现任何编译器错误。这表明你的问题在别处。