Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 调用对象指针的虚拟函数导致的段错误_C++_Embedded_Segmentation Fault_Virtual_Mips - Fatal编程技术网

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++都基于相同的源代码,因此两个工具都会出现任何编译器错误。这表明你的问题在别处。