希望哪位高手能帮我修正一下程序(就几行代码,但总报错)
呵,其实我就想试一下拷贝构造函数与多态,请帮我指出错误在哪就行了,现在问题,就在拷贝那,我把代码复制上来
#include<iostream>
#include<string>
using namespace std;
class base{
public:
base(){cout<<"构造base"<<endl;}
virtual void create(){display();}
virtual void display(){cout<<"display base"<<endl;}
~base(){cout<<"析构base"<<endl;}
};
class sub:public base{
char* s;
public:
sub* theApp;
sub(char* p){
cout<<"构造 sub->"<<p<<endl;
s=new char(strlen(p)+1);
if(s) strcpy(s,p);
theApp=this;
}
sub(const sub& ss){
cout<<"拷贝构造"<<endl;
s=new char(strlen(ss.s)+1);
if(s) strcpy(s,ss.s);
theApp=this;
}
virtual void display(){cout<<"display sub"<<endl;}
~sub(){cout<<"析构sub->"<<s<<endl;delete[] s;}
};
sub* get_obj(sub obj); // 使用传值
sub objs("objs"); //全局
int main(){
sub* q=get_obj(objs);
q->create();// 这没有触发析构函数,是不是因为指针对象的关系?
sub x("x"); //想再生成个对象试一下,可是没到这 就出问题了,想也不想不通
x.create();
}
sub* get_obj(sub obj){return obj.theApp;}
[解决办法]
不知道你什么目的,但是下面这个句子是有问题的
sub* get_obj(sub obj){return obj.theApp;}
返回的是obj的一个临时拷贝的成员变量theApp,
退出函数的时候,这个临时变量也被析构了
q所指向的东西也就不存在了,所q->create 会出错。
可以改为:
sub* get_obj(sub &obj){return obj.theApp;}
[解决办法]
new也写错了
[解决办法]
事实上,错误发生在 q->create();那里,你返回的obj的theApp的时候那个拷贝的临时变量obj被析构了,q指针所指向的对象被释放了。所以错误发生了。
而且你的new char数组大小也有问题。给你改了下
class base{public: base(){cout<<"构造base"<<endl;} virtual void create(){display();} virtual void display(){cout<<"display base"<<endl;} ~base(){cout<<"析构base"<<endl;}};class sub:public base{ char* s;public: sub* theApp; sub(char* p){ cout<<"构造 sub->"<<p<<endl; s=new char[10]; if(s) strcpy(s,p); theApp=this; } sub(const sub& ss){ cout<<"拷贝构造"<<endl; s=new char[10]; if(s) strcpy(s,ss.s); theApp=ss.theApp; } virtual void display(){cout<<"display sub"<<endl;} ~sub(){cout<<"析构sub->"<<s<<endl;delete[] s;}};sub* get_obj(sub obj); // 使用传值sub objs("objs"); //全局int main(){ sub* q=get_obj(objs); q->create();// 这没有触发析构函数,是不是因为指针对象的关系? sub x("x"); //想再生成个对象试一下,可是没到这 就出问题了,想也不想不通 x.create(); return 0;}sub* get_obj(sub obj){return obj.theApp;}
[解决办法]
new出的数组有点问题