免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1629 | 回复: 6
打印 上一主题 下一主题

[函数] 求教一个构造函数赋值问题,程序附后面. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-10-01 17:43 |只看该作者 |倒序浏览
#include <iostream>;
using namespace std;
class Teacher
{
public:
Teacher(char *input_name)
{
//name=new char[10];
//strcpy(name,input_name);
name=input_name;    //这样赋值是错误的
}

~Teacher()
{
    cout << this->;name << endl;
}

void show();

protected:
char *name;

};

void Teacher::show()
{
cout<<name<<endl;
}

void main()
{
    Teacher a("test";
    a.show();
    cin.get();
}

请问,上面的name=input_name;的赋值方式真是错了吗?我执程序在析构函数中可以正常析构this->;name.
在这里是不是一定得采用new的方式才正确?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2005-10-01 18:00 |只看该作者

求教一个构造函数赋值问题,程序附后面.

1>;一般来讲真的是错了.name=input_name;    //多此一举的.
2>;析构里要调用delete [].不是说输出来了就正常析构了.
3>;一般要用new,看你想表达什么意思.

论坛徽章:
0
3 [报告]
发表于 2005-10-01 19:28 |只看该作者

求教一个构造函数赋值问题,程序附后面.

必须用delete [],不然内存泄露

论坛徽章:
0
4 [报告]
发表于 2005-10-01 19:34 |只看该作者

求教一个构造函数赋值问题,程序附后面.

[quote]原帖由 "wzg_8041"]存泄露[/quote 发表:


在我没有使用://name=new char[10];时也必须用[]delete吗?
我只是将name指向"test",没有构建新的数组.

论坛徽章:
0
5 [报告]
发表于 2005-10-01 19:48 |只看该作者

求教一个构造函数赋值问题,程序附后面.

请教:"1>;一般来讲真的是错了.name=input_name;    //多此一举的."?
这里不是能初始化name吗?
不知道我理解的对不对:
我认为:
1>; 使用
name=input_name;
这样子可以将name指向"test"字符串.也就是对name进行了初始化.但这样子的话在析构函数中就不须要使用[]delete,因为我并没有使用new占用堆内存.这样子也应该没有错.
2>; 使用
//name=new char[10];
//strcpy(name,input_name);
这样是在堆内由new分配了内存,让name指向该内存地址.再将"test"字符串拷贝到堆内.这时析构函数中才要加入[]delete.否则会导致内存泄露.

请高手指点!

论坛徽章:
0
6 [报告]
发表于 2005-10-01 20:17 |只看该作者

求教一个构造函数赋值问题,程序附后面.


  1. 理解正确,但你的类的设计有问题。
  2. 1>; 使用
  3. name=input_name;
  4. 这样子可以将name指向"test"字符串.也就是对name进行了初始化.但这样子的话在析构函数中就不须要使用[]delete,因为我并没有使用new占用堆内存.这样子也应该没有错.
  5.   是这样,但你同时限制了数据的分配方式。

  6. 2>; 使用
  7. //name=new char[10];
  8. //strcpy(name,input_name);
  9. 这样是在堆内由new分配了内存,让name指向该内存地址.再将"test"字符串拷贝到堆内.这时析构函数中才要加入[]delete.否则会导致内存泄露.

  10. 一般不是这样,应当是
  11. name = new char[strlen(input_name) + 1);
  12. if (name == NULL)
  13. {
  14.       throw std::exception("alloc memory failed");
  15. }
  16. strcpy(name, input_name);

  17. 并且一旦采用这种形式,就必须建立拷贝构造函数和赋值运算符重载,另外还有析构函数。

  18. 考虑到input_name的来源,有以下几种形式。
  19. 1. char input_name[] = "test";

  20. 2.  char* input_name = "test";

  21. 3.
  22.   char* input_name = (char *)malloc(strlen("test") + 1);
  23.   strcpy(input_name, "test");

  24. 假定现在有以下代码
  25. Test doSomething()
  26. {
  27.         char* input_name = (char *)malloc(strlen(test") + 1);
  28.         strcpy(input_name, "test");
  29.         Test a(input_name);
  30.         
  31.         return a;
  32. }

  33. void doAnother()
  34. {
  35.         Test a = doSomething();
  36.         Test b = a;         //编译器产生一个执行memberwise bit copy的拷贝构造函数。
  37.         //现在会产生一个malloc分配的内存由谁释放以及如何释放的问题。
  38. }

  39.   按照你的设计,除非限制存储分配方式或者建立一种数据分配的引用计数机制,才不会产生问题。
复制代码

论坛徽章:
0
7 [报告]
发表于 2005-10-01 21:03 |只看该作者

求教一个构造函数赋值问题,程序附后面.

明白了,谢谢
  
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP