多重继承 析构两次

redoffice 2010-06-08 03:09:47
写了一个程序,发现在析构的时候发生了两次析构,求解决办法


class Student
{
char* pStudentName;
public:
void SetStudentName(char* pName);
char* GetStudentName();
virtual ~Student();
};
//-----------------------------------------//
void Student::SetStudentName(char* pName)
{
pStudentName = new char[strlen(pName)+1];
strcpy(pStudentName,pName);
}
//-----------------------------------------//
char* Student::GetStudentName()
{
return pStudentName;
}
//-----------------------------------------//
Student::~Student()
{
delete [] pStudentName;
}
//-----------------------------------------//
class AmericanStudent
{
char* pAmericanStudentName;
public:
void SetAmericanStudentName(char* pName);
char* GetAmericanStudentName();
virtual ~AmericanStudent();
};
//-----------------------------------------//
void AmericanStudent::SetAmericanStudentName(char* pName)
{
pAmericanStudentName = new char[strlen(pName)+1];
strcpy(pAmericanStudentName,pName);
}
//-----------------------------------------//
char* AmericanStudent::GetAmericanStudentName()
{
return pAmericanStudentName;
}
//-----------------------------------------//
AmericanStudent::~AmericanStudent()
{
delete [] pAmericanStudentName;
}
//-----------------------------------------//
class Translator : public Student,public AmericanStudent//
{

};

//-----------------------------------------//

void main()
{
Translator *pAmericanStudent = new Translator();
pAmericanStudent->SetAmericanStudentName("name");
//pAmericanStudent->SetStudentName("name");
delete pAmericanStudent;

}



执行delete的时候按顺序应该是先调用 Translator的析构函数然后再是 AmericanStudent的然后是Student的。

因此析构两次,造成错误。如果取消注释则正确。

求解释原因。如果不加注释行如何解决此类问题。
...全文
130 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
cattycat 2010-06-08
  • 打赏
  • 举报
回复
父类的char指针成员必须初始化设成NULL的,否则析构会发生错误。
析构两次析构父类没问题。
alicktony 2010-06-08
  • 打赏
  • 举报
回复
楼主这个类有很多问题,operator= ,copy constructor 也需要重写
selooloo 2010-06-08
  • 打赏
  • 举报
回复
LZ这个类有很多漏洞,Student和Americanstudent没有默认构造函数,
Translator *pAmericanStudent = new Translator();//这里pAmericanStudent->pStudentName是随机值
delete pAmericanStudent;//调用Student::~Student()
执行delete [] pAmericanStudent->pStudentName;//删除一个随机指针指向的内存,所以出错

pAmericanStudent->SetStudentName("name");这里pAmericanStudent->pStudentName获得一个合法堆区指针,再析构就不会出错了


Longerandlonger 2010-06-08
  • 打赏
  • 举报
回复
喜欢楼主的排版风格,看得出来,你很认真。
liutengfeigo 2010-06-08
  • 打赏
  • 举报
回复
char* Student::GetStudentName()
{ pStudentName = new char [1];
pStudentName[0] = '\0';

}
liutengfeigo 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 pengzhixi 的回复:]

为Student和Americanstudent添加默认构造函数将指针成员设置为NULL,在析构函数里面判断指针成员是否为空,如果非空那么再delete[]
[/Quote]
这是好办法
redoffice 2010-06-08
  • 打赏
  • 举报
回复
学习了。
huang_dy 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 pengzhixi 的回复:]

为Student和Americanstudent添加默认构造函数将指针成员设置为NULL,在析构函数里面判断指针成员是否为空,如果非空那么再delete[]
[/Quote]
pengzhixi 2010-06-08
  • 打赏
  • 举报
回复
为Student和Americanstudent添加默认构造函数将指针成员设置为NULL,在析构函数里面判断指针成员是否为空,如果非空那么再delete[]
SuperLampard 2010-06-08
  • 打赏
  • 举报
回复
关注!!!!!!

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧