c++构造函数中动态申请内存,在析构函数中释放内存

EmliaEMT 2017-06-08 07:44:59

输入姓名的时候出现错误 求助!!!!






#include<iostream>
#include<string.h>
using namespace std;
class employee
{ protected:
char *name;
int number;
int sallary;
public:
employee();
employee(char *newname,int newnumber);
virtual void pay();
virtual void print();
~employee();
};
employee::employee()
{
this->name="xxx";
this->number=0;
this->sallary=0;
}

employee::employee(char *newname,int newnumber){
name=new char [strlen(newname)+1];
strcmp(name,newname);
number=newnumber;
}

void employee::pay()
{
sallary=0;
}
void employee::print()
{

cout<<"name="<<name<<",NO="<<number<<endl;

}
employee::~employee()
{

delete [] name;

}

class salesman:public employee
{ private:
float rate,sale;
public:
salesman();
salesman(char* name,int number,float rate,int sale):employee(name,number)
{
this->rate=rate;
this->sale=sale;
}
void print();
void pay();
};

salesman::salesman()
{
this->sale=0;
this->rate=0;
}
void salesman::pay()
{
sallary=rate*sale;

}

void salesman::print()
{

cout<<"name="<<name<<",NO="<<number<<",wages="<<sallary<<",rate="<<rate<<",sales="<<sale<<endl;

}
class tech:public employee
{
private:
float hours,rate;
public :
tech();
tech(char *name,int number,int hours,int rate):employee(name,number){
this->hours=hours;
this->rate=rate;
};
void pay();
void print();
};
tech::tech()
{
this->hours=0;
this->rate=0;

}

void tech::pay()
{
sallary=hours*rate;
}
void tech::print()
{
cout<<"name="<<name<<",NO="<<number<<",wages="<<sallary<<",hourRate="<<rate<<",workHours="<<hours<<endl;

}

void fun(employee& ref)

{

ref.pay();

ref.print();

cout<<endl;

}




int main()

{

char name[10];

int NO;

float rate, sales;

cin>>name>>NO>>rate>>sales;

salesman s(name,NO,rate,sales);

float hourRate,workHours;

cin>>name>>NO>>hourRate>>workHours;

tech t(name,NO,hourRate,workHours);

fun(s);

fun(t);

return 1;

}
...全文
1055 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
EmliaEMT 2017-06-14
  • 打赏
  • 举报
回复
引用 6 楼 tomsoft 的回复:
函数:employee::employee(char *newname,int newnumber){ 中第三行:strcpy(name, newname);
额 才发现打错了
「已注销」 2017-06-13
  • 打赏
  • 举报
回复
函数:employee::employee(char *newname,int newnumber){ 中第三行:strcpy(name, newname);
EmliaEMT 2017-06-12
  • 打赏
  • 举报
回复
就是我的结果的name=那一项的结果不正确,至于char数组的话是英文名长度没问题的,还有我用了name来指向new开辟的空间 然后不是应该delete吗。
EmliaEMT 2017-06-12
  • 打赏
  • 举报
回复
引用 4 楼 tomsoft 的回复:
[quote=引用 3 楼 EmliaEMT 的回复:]
就是我的结果的name=那一项的结果不正确,至于char数组的话是英文名长度没问题的,还有我用了name来指向new开辟的空间
然后不是应该delete吗。

比较容易改:employee()中this->name=NULL; 析构函数中增加一个判断就可以了。[/quote]

改了之后还是不对
「已注销」 2017-06-12
  • 打赏
  • 举报
回复
引用 3 楼 EmliaEMT 的回复:
就是我的结果的name=那一项的结果不正确,至于char数组的话是英文名长度没问题的,还有我用了name来指向new开辟的空间 然后不是应该delete吗。
比较容易改:employee()中this->name=NULL; 析构函数中增加一个判断就可以了。
赵4老师 2017-06-09
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。 判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
    int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]

    srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
    while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
        b[(a=rand()%11)]=0;
        Sleep(100);
        b[(a=rand()%11)]=1;
        Sleep(100);
        b[(a=rand()%11)]=2;
        Sleep(100);
        b[(a=rand()%11)]=3;
        Sleep(100);
        b[(a=rand()%11)]=4;
        Sleep(100);
    }
    return 0;
}
「已注销」 2017-06-09
  • 打赏
  • 举报
回复
有几处显而易见的错误: 1)employee的无参构造函数: this->name="xxx"; 这样这个函数即派生函数在执行析构函数会出错:delete [] name; 静态变量怎能delete。 2)char name[10];确定这个长度没有问题吗?字串必须考虑一个终结符。另外,如果输入是中文?如果在输入名字死机,查查是不是这个数组越界

64,649

社区成员

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

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