锁定老帖子 主题:关于C++拷贝构造函数的疑惑
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-04-18
拷贝构造函数里面的this指针赋值会导致下一次的拷贝函数的调用,然后不停的拷贝函数的调用,然后就stackoverflow了。
|
|
返回顶楼 | |
发表时间:2012-12-18
chaooo 写道 第28行不会无限循环吗?
我觉得这个东西叫做无限递归比较合适,必然引起堆栈溢出 |
|
返回顶楼 | |
发表时间:2012-12-18
sniffer123 写道 lc7cl 写道 改成
CTest& CTest::operator=(const CTest &test) { if (&test == this) return *this; this->a = test.a; return *this; } 我猜楼主是想这样 CTest& CTest::operator=(const CTest &test) { if (&test == this) return *this; //this->a = test.a; memcpy(this,&test,sizeof(CTest)); return *this; } 不过这样会导致内存泄露。估计是变量多不想一个个写 ![]() 前辈,恕我愚钝,指导下我,这样写为什么就会内存泄露?感觉没有问题啊 |
|
返回顶楼 | |
发表时间:2013-01-19
earneet 写道 sniffer123 写道 lc7cl 写道 改成
CTest& CTest::operator=(const CTest &test) { if (&test == this) return *this; this->a = test.a; return *this; } 我猜楼主是想这样 CTest& CTest::operator=(const CTest &test) { if (&test == this) return *this; //this->a = test.a; memcpy(this,&test,sizeof(CTest)); return *this; } 不过这样会导致内存泄露。估计是变量多不想一个个写 ![]() 前辈,恕我愚钝,指导下我,这样写为什么就会内存泄露?感觉没有问题啊 好久没上JE了。。 因为,假如你的CTest构造函数是这样的: CTest(){ m_p = new int[100]; } 析构是这样的: ~CTest(){ delete[] m_p; } 那么当你使用operator=的时候,m_p会指向同一块内存,这样当某一个CTest的实例先析构的时候,m_p就会变成hang pointer。同理,在拷贝构造函数中也需要注意这个情况。 多扯两句,C++中需要考虑RIIA,另外又有“在初始化列表中初始化效率高”的说法,所以构造函数,复制构造函数倾向于在初始化列表中初始化,而赋值函数又需要在函数中赋值,所以如果一个类成员变量很多的话,会觉得异常繁琐。这也是C++让人觉得不爽的地方之一。其他的语言,比如C,memset直接清为0,多干净。而java,一方面是可以在声明的时候定义并赋值,省却了专门写初始化式的功夫,另外又明确地提出复制构造函数和赋值函数需要专门书写(重载构造函数以及编写专门的赋值函数),而不会自动帮你生成,简单明了。而C++的,复杂得让你望而生畏。POD和非POD,各种各样的情况下处理都不尽相同。 |
|
返回顶楼 | |