关于类数据成员申请地址的问题
- 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,是否需要值拷贝等。