我知道这个标题听起来很熟悉,因为有很多类似的问题,但我是在问这个问题的不同方面(我知道在堆栈上拥有事物和将它们放在堆上之间的区别)。
在Java中,我总是可以返回对“本地”对象的引用。
public Thing calculateThing() {
Thing thing = new Thing();
// do calculations and modify thing
return thing;
}
在C++中,要实现类似的功能有两种选择:
(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;
使用第一种方法,我不需要手动释放内存,但对我来说它使代码难以阅读。第二种方法的问题是,我需要记住删除thing;
,这看起来并不好。我不想返回复制的值,因为这样效率很低(我认为),所以就有了以下问题:
- 是否有第三种解决方案(不需要复制该值)?
- 如果坚持使用第一种解决方案,是否会有任何问题?
- 什么时候以及为什么应该使用第二种解决方案?