回 帖 发 新 帖 刷新版面

主题:谁能帮我调试这个程序

刚学了抽象类和虚函数,这个程序过不了,大家帮忙看是什么问题,谢谢!!!!
//process.h
class process
{
public:
    virtual void print()=0;
};


//person.h
#include<string.h>
#include"process.h"
class person : public process
{
private:
    char *name;
    char sex[5];
public:
    person(){name=NULL;strcpy(sex,"男");}
    person(const person &ob)
    {
        name=new char[strlen(ob.name)+1];
        strcpy(name,ob.name );
        strcpy(sex,ob.sex);
    }
    ~person(){delete []name;}
    void setp()
    {
        char na[30];
        cout<<"Input name ";cin>>na;
        name=new char[strlen(na)+1];
        strcpy(name,na);
        cout<<"Input sex ";cin>>sex;
    }
    virtual void print()
    {cout<<name<<","<<sex;}
};


//student.h
#include"person.h"
#include<string.h>
class student : public person
{
private:
    char *department;
    char *major;
    int score;
public:
    student(){department=NULL;major=NULL;}
    student(const student &ob)
    {
        department=new char[strlen(ob.department )+1];
        strcpy(department,ob.department );
        major=new char[strlen(ob.major )+1];
        strcpy(major,ob.major );
    }
    ~student(){delete []department;delete []major;}
    void sets();
    void print();
};
void student::sets()
{
    char dp[30];
    char mj[30];
    cout<<"Input department ";cin>>dp;
    department=new char [strlen(dp)+1];
    strcpy(department,dp);
    cout<<"Input major ";cin>>mj;
    major=new char[strlen(mj)+1];
    strcpy(major,mj);
    cout<<"Input score ";cin>>score;
}
void student::print()
{
    person::print();
    cout<<",study at "<<department<<" department,major at "<<major<<",score is "<<score;
    cout<<endl;
}


//xzcexp807.cpp
#include<iostream.h>
#include"student.h"
void main()
{
    process *p;
    person ps;
    student st;
    ps.setp();
    st.sets();
    p=&ps;
    p->print();
    p=&st;
    p->print();
}

回复列表 (共6个回复)

沙发

p=&st;
p->print();

这个时候发生了内存非法访问。
因为你 构造 student st;时候,其基类的(char *name;)是为NULL的,而你在st.print的时候,里面调用了基类的print,这样就出现了内存非法访问了


板凳

还有一个问题就是 person.set和student.set 的没调用一次就就有一块内存泄露

3 楼


我下面用person.set()赋值给了*name,所以不是NULL了啊,而派生类访问基类的公有函数,并且用了同名访问的方法(person::),所以对你的说法不是很明白,不过还是谢谢了!!!

4 楼


喔,我翻完了整本书,也没找到关于内存泄漏的内容,我才大一,超了老师6个单元,所
以你能说明白点吗?

5 楼


 person ps;
    student st;
这是两个对象
 ps.setp();并没有给st的name赋值,
两个对象,互不相干。
ps包含:
   char *name;
    char sex[5];

st包含:
   char *name;
    char sex[5];
  char *department;
    char *major;
    int score;

6 楼


说到点子上了,问题解决

我来回复

您尚未登录,请登录后再回复。点此登录或注册