放分!!请帮偶找出错误
#include <iostream.h>
#include <string.h>
class TfirstDemo
{
private:
char name[20];
int age;
int sex;
int height;
int weight;
public:
char* getName();
int getAge();
char getSex();
int getHeight();
int getWeight();
virtual void showAll();
TfirstDemo(int a,int b,int c,int d,char* n): //构造函数
age(a),sex(b),height(c),weight(d)
{
strncpy(name,n,sizeof(name));
};
};
class TsecondDemo:public TfirstDemo
{
int ID;
public:
char *Pr;
int getID();
void putValue()
{
}
void showAll();
TsecondDemo(int a,int b,int c,int d,char* n,int id):TfirstDemo(a,b,c,d,n)
{
ID=id;
Pr=new char[20];
Pr="Demo";
}
~TsecondDemo()
{
cout<<"delete this point"<<endl;
delete Pr; /*问题出在这里~偶是用VC6.0编译的
为什么偶delete Pr错了呢?只要去掉这个句子就以运行成
功*/
}
};
int TsecondDemo::getID(){return ID;};
void TsecondDemo::showAll()
{
cout<<"姓名:"<<getName()<<endl;
cout<<"性别:"<<getSex()<<endl;
cout<<"年龄:"<<getAge()<<endl;
cout<<"身高:"<<getHeight()<<endl;
cout<<"体重:"<<getWeight()<<endl;
cout<<"ID: "<<getID()<<endl<<endl;
};
int TfirstDemo::getAge(){return age;};
char TfirstDemo::getSex(){if(sex==1) return 'G';else return 'M';};
int TfirstDemo::getHeight(){return height;};
int TfirstDemo::getWeight(){return weight;};
char* TfirstDemo::getName(){return name;};
void TfirstDemo::showAll()
{
cout<<"姓名:"<<getName()<<endl;
cout<<"性别:"<<getSex()<<endl;
cout<<"年龄:"<<getAge()<<endl;
cout<<"身高:"<<getHeight()<<endl;
cout<<"体重:"<<getWeight()<<endl<<endl;
};
void fn(TfirstDemo &s){
s.showAll();
}
void main(){
cout<<"HBB is Hanbobo^^"<<endl;
TfirstDemo chen(20,1,172,105,"etu5");
TsecondDemo qin(20,1,173,110,"DemoSoft",29);
fn(chen);
fn(qin);
cout<<qin.Pr<<endl;
}
问题点数:20、回复次数:6Top
1 楼stone112979(梦醒十分)回复于 2002-10-09 22:52:15 得分 0
delete 好像没错。
我觉得好像应该把析构函数放在上面。Top
2 楼blh(当你不割肉时,你的损失只是个数字,当你割肉时,你的损失就是你的肉)回复于 2002-10-09 22:53:54 得分 0
delete使用错误,你new的是数组,必须使用delete []释放数组
改成
~TsecondDemo()
{
cout<<"delete this point"<<endl;
delete []Pr; /*问题出在这里~偶是用VC6.0编译的
为什么偶delete Pr错了呢?只要去掉这个句子就以运行成
功*/
}Top
3 楼Zark(金陵五月)回复于 2002-10-09 22:56:06 得分 15
之所以错,是因为这两句,
Pr=new char[20];
Pr="Demo";
第一句在堆上取了20字节的内存,并将pr指向这块内存.
第二句将pr指向一个只读字符串,原指向已被丢弃,因此如果delete,将会出错.
改为
Pr=new char[20];
strcpy(Pr,"Demo");
Top
4 楼shh03(半山腰)回复于 2002-10-09 23:00:29 得分 5
Pr="Demo";// 这句有点问题,好像字符串是一个常量,存储在内存的常量区,
//而用delet Pr ,删的是在堆上分配的内存,我也说不清楚
//你不如在Pr=new char[20];后直接往*p一个字符一个字符地放Top
5 楼zhpsam109(JACKY.昊昊)回复于 2002-10-10 09:08:09 得分 0
zark说的很正确!!!Top
6 楼etu5(外星人)回复于 2002-10-10 15:33:19 得分 0
谢谢金陵五月和半山腰两位的帮助!:)Top




