内存问题请教
box f()
{ box box1(12,15,18);
return box1;
}
int main(void)
{ box box2;
box2=f();
}
请问:类对象是不是存储在栈内存,上面对象box1的作用域在f()内,返回box1应该不对是吧,应该是垃圾是吧.但为什么书上说调用了box类的复制构造函数,不明白,请指教。感谢大家
[解决办法]
因为你返回的是box类型,编译器会进行一些处理让返回的class是正确的.
是调用了一次box的拷贝构造函数构造了一个临时对象,然后用这个临时对象给box2赋值.
当然这是在没有进行返回值优化的情况下的说法
[解决办法]
返回时用复制构造函数形成临时对象
[解决办法]
f()的原型是box f(void);
返回的时候需要以box1为参数构造一个临时对象,相当于return box(box1);
[解决办法]
当函数的返回值为类类型的值时会调用类的复制构造函数。box1是局部的对象,函数终止,结束该对象的生存期,则需要利用复制构造函数创建该对象的一个匿名副本,称为临时副本,以把返回值返回给调用者。
[解决办法]
return box1(12,15,18);
诸位,这个同楼主的效率一样吗
[解决办法]
请问:类对象是不是存储在栈内存,上面对象box1的作用域在f()内,返回box1应该不对是吧,应该是垃圾是吧.但为什么书上说调用了box类的复制构造函数,不明白,请指教。感谢大家
类对象box box1(12,15,18)的确是在栈上分配的内存,但是返回不会是垃圾,这是因为你的返回类型是一个box,那么在返回的时候,系统就会用box1去做为参数拷贝构造一个新的对象来返回,然后再释放到box1,而这那个新对象已经独立存在了,所以不会是垃圾
楼主说的那种返回垃圾的情况是:返回指向栈内存的指针或引用,也就是这样:
char* test()
{
char i= 'f ';
return &i;
}
这里i是栈内存,返回它的指针,而test结束时,i被释放,返回的指针指向了垃圾
复制构造函数也就是拷贝构造函数,楼主要去看一些关于这方面的章节,每本C++里都有的
[解决办法]
return box1(12,15,18);
诸位,这个同楼主的效率一样吗
这个叫返回值命名优化,大部分编译器会进行一些优化处理
[解决办法]
不考虑优化的情况下,基本上是下面这样:
box f()
{ box box1(12,15,18); //构造函数
return box1; //box1到返回值的拷贝构造函数,也就是将新对象返回到了f()的调
} //用处
//析构box1
int main(void)
{ box box2; //构造函数
box2=f(); //f()到box2的赋值操作符赋值
} //析构临时对象和box2
[解决办法]
Xlbdan is right.