我知道标题听起来很耳熟,因为有许多类似的问题,但是我要问的是问题的另一个方面(我知道将事物放在堆栈上并将它们放在堆上的区别)。
在Java中,我总是可以返回对“本地”对象的引用
public Thing calculateThing() {
Thing thing = new Thing();
// do calculations and modify thing
return thing;
}
在C ++中,要做类似的事情,我有2个选择
(1)每当需要“返回”对象时,我都可以使用引用
void calculateThing(Thing& thing) {
// do calculations and modify thing
}
然后像这样使用它
Thing thing;
calculateThing(thing);
(2)或者我可以返回指向动态分配对象的指针
Thing* calculateThing() {
Thing* thing(new Thing());
// do calculations and modify thing
return thing;
}
然后像这样使用它
Thing* thing = calculateThing();
delete thing;
使用第一种方法,我不必手动释放内存,但是对我来说,这会使代码难以阅读。第二种方法的问题是,我必须记住to delete thing;
,这看起来不太好。我不想返回复制的值,因为它效率低下(我认为),所以这里出现了问题
- 有没有第三种解决方案(不需要复制值)?
- 如果我坚持第一个解决方案,有什么问题吗?
- 什么时候以及为什么要使用第二种解决方案?