记录一个比较简单的异常以及解决办法。
这就是我遇见的一个异常。以下是源代码
#include<iostream>
using namespace std;
class A // 自定义的一个类
{
public:
A() {
s = "A类";
i = 6;
}
void show() {
cout << s<<endl;
cout << i << endl;
}
private:
string s="初始";
int i;
};
A* func() { //一个返回自定义类指针的函数
A a;
A* ptr = &a;
//a的作用域只有这个func函数,这两句句可以换为以下
// A* a = new A ; A *ptr =a;
// static A a; A* ptr = &a;
//或者将A a;上移两行定义到函数的外部成为全局变量
cout << "函数内";
ptr->show();
return ptr;
}
int main() {
A* ptr = func();
ptr->show();
}
,注意func函数中生成了一个A 类的对象。但是返回之后显示 读取异常,其实是因为string触发了这个异常。如果没有string,show()输出的 i的值应该是随机值(我电脑上是-858993460)
这是为什么呢?其实很简单,C++中,每个类的对象在函数结束时,指的是它的作用域结束时,系统将自动调用它的析构函数,
以释放它所占用的资源。虽然这里的return 起到了返回对象地址的作用,但是却没有意义。
但是,如果用new运算动态地建立一个对象,那用delete运算符释放该对象时,才会调用析构函数。
另外,如果我们将它的生命周期拓宽,也可以解决这个问题。
解决方案:
1.用new 创建对象
2.定义为static 或者全局
具体的操作都在程序中注释了,修改后程序输出应该为