首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于类数据成员申请地址的有关问题

2012-06-13 
关于类数据成员申请地址的问题C/C++ code# include iostreamusing namespace stdclassperson{private:c

关于类数据成员申请地址的问题

C/C++ code
# include <iostream>using namespace std;class  person{private:     char  *name;    //name指向信息串      int   age;        //年龄  public:      person();        // 构造函数说明      ~person();    // 析构函数说明      void  assignment(char *a, int b); // assignment函数说明      void  show ();         // show函数说明  };// 构造函数定义person :: person()    {  name=new char('\0');// 为name申请存储空间,置为空    age=-1;        // 为age 赋初始值  }// 析构函数定义person :: ~person(){  delete [ ] name;       // 回收name空间    }// assignment函数定义void person :: assignment(char *a, int b) { name = new  char[strlen(a) + 1];   strcpy(name,a);           // 用参数a的值修改name   age=b;   };// show函数定义void  person :: show (){ cout << "\n  姓名:" << name << "  年龄:" << age ;  };void main ()  { // 生成对象数组emp[5]     person  emp[5];     // 给对象数组赋值     emp[0].assignment("张立三",25);     emp[1].assignment("王冠之",28);     emp[2].assignment("王大成",35);     emp[3].assignment("英乐乐",21);     emp[4].assignment("胡忠厚",26);// 显示emp    int  i;    for (i=0; i<5; i++)    {  emp[i].show();  }    cout <<endl<<endl; }


其中 有构造函数
person :: person()
{ name=new char('\0');// 为name申请存储空间,置为空
  age=-1;// 为age 赋初始值
}

还有分配函数
void person :: assignment(char *a, int b)
{ name = new char[strlen(a) + 1];
  strcpy(name,a); // 用参数a的值修改name
  age=b;
};

OK,主函数 声明了一个 person 类的数组 emp[5];
那么从emp[0]到emp[4]这5个对象都调用了默认构造函数person::person()。

而person()里 对 数据成员name 申请一次 空间。

紧接着 主函数里,调用 person::assignment 函数,给每个对象的数据成员赋值。
问题就在出来了,
assignment函数里 name = new char[strlen(a)+1],再一次给 name 申请空间。。

我的问题是,两次 申请空间是否造成空间浪费? 由于第一次的空间没有delete,是否就造成了内存泄露?
这段代码编译 运行都是成功的,是不是 person()里 改成 name = new char("2b") ,这个编译就不成功了?

[解决办法]
在你的assignment再次给name分配空间前,你应该先将上一次给它的空间释放掉:
C/C++ code
void person :: assignment(char *a, int b){     delete name;    name = new  char[strlen(a) + 1];    strcpy(name,a);           // 用参数a的值修改name    age=b;};
[解决办法]
assignment,operator=,等涉及到复制且类中有指针成员的时候,
需要仔细考虑,是否需要释放原有资源,指针delete之后是否需要置0以防止
多次delete,是否需要值拷贝等。

热点排行