- 论坛徽章:
- 0
|
求教一个构造函数赋值问题,程序附后面.
- 理解正确,但你的类的设计有问题。
- 1>; 使用
- name=input_name;
- 这样子可以将name指向"test"字符串.也就是对name进行了初始化.但这样子的话在析构函数中就不须要使用[]delete,因为我并没有使用new占用堆内存.这样子也应该没有错.
- 是这样,但你同时限制了数据的分配方式。
- 2>; 使用
- //name=new char[10];
- //strcpy(name,input_name);
- 这样是在堆内由new分配了内存,让name指向该内存地址.再将"test"字符串拷贝到堆内.这时析构函数中才要加入[]delete.否则会导致内存泄露.
- 一般不是这样,应当是
- name = new char[strlen(input_name) + 1);
- if (name == NULL)
- {
- throw std::exception("alloc memory failed");
- }
- strcpy(name, input_name);
- 并且一旦采用这种形式,就必须建立拷贝构造函数和赋值运算符重载,另外还有析构函数。
- 考虑到input_name的来源,有以下几种形式。
- 1. char input_name[] = "test";
- 2. char* input_name = "test";
- 3.
- char* input_name = (char *)malloc(strlen("test") + 1);
- strcpy(input_name, "test");
- 假定现在有以下代码
- Test doSomething()
- {
- char* input_name = (char *)malloc(strlen(test") + 1);
- strcpy(input_name, "test");
- Test a(input_name);
-
- return a;
- }
- void doAnother()
- {
- Test a = doSomething();
- Test b = a; //编译器产生一个执行memberwise bit copy的拷贝构造函数。
- //现在会产生一个malloc分配的内存由谁释放以及如何释放的问题。
- }
- 按照你的设计,除非限制存储分配方式或者建立一种数据分配的引用计数机制,才不会产生问题。
复制代码 |
|