一个c++程序显示段错误,main函数中断点调试到getresult()显示有段错误
发布网友
发布时间:2022-06-01 17:29
我来回答
共1个回答
热心网友
时间:2023-10-09 17:32
错误在你是在栈中申明对象的,当g调用之后,对象b或者对象c以及被销毁了,而test指向的地址自然也就是一个未知的地址,所以出现错误。正确的方法,应该使用new在堆中申请内存。
case 0:
{b bt;
test=&bt;
break;}
修正后的代码
#include <iostream>
#include <memory>
using namespace std;
class a{
public:
virtual void getprice(double&){};
};
class b:public a
{
public:
b(){};
void getprice(double& money)
{
cout<<"b"<<endl;
};
};
class c:public a
{
private:
double rate;
public:
c(){};
c(double ra){rate=ra;};
void getprice(double& money)
{
money=money*rate;
cout<<"c"<<endl;
};
};
class g
{
private:
a* test;
public:
g(int i)
{
switch(i)
{
case 0:
test=new b;//在堆中申请内存
break;
case 1:
test=new c(0.8);//在堆中申请内存
break;
}
};
void getresult(double money)
{
test->getprice(money);
cout<<money<<endl;
}
~g(){//在析构函数中释放内存
if (test){
delete test;
cout<<"Destructor test object"<<endl;
}
}
};
int main()
{
g tes(1);
tes.getresult(100);
cout<<"ok"<<endl;
return 0;
}
追问按你说的成功了,只是有几点不太明白:在栈中声明对象,是什么栈?属于g的类的栈?为什么g被调用之后会被销毁? 我有点小白··· 已经明白了 谢谢
追答至于什么是堆、什么是栈,这个问题你还是到网上多查一查!
只有懂了什么是栈,你才能明白什么每个变量的生存周期是什么?
所以,我只能给你建议和方向,具体的还需要你自己学习!