论坛首页 编程语言技术论坛

关于C++拷贝构造函数的疑惑

浏览 7244 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-04-18  
拷贝构造函数里面的this指针赋值会导致下一次的拷贝函数的调用,然后不停的拷贝函数的调用,然后就stackoverflow了。
0 请登录后投票
   发表时间:2012-12-18  
chaooo 写道
第28行不会无限循环吗?

我觉得这个东西叫做无限递归比较合适,必然引起堆栈溢出
0 请登录后投票
   发表时间: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;
}

不过这样会导致内存泄露。估计是变量多不想一个个写


前辈,恕我愚钝,指导下我,这样写为什么就会内存泄露?感觉没有问题啊
0 请登录后投票
   发表时间: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,各种各样的情况下处理都不尽相同。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics