【发布时间】:2014-06-16 13:25:49
【问题描述】:
我是 C++ 新手,遇到以下问题:
假设您有一个创建新对象并返回该对象的函数。最好的方法是什么? 我找到了 3 种不同的解决方案。
解决方案一使用复制构造函数
MyClass getMyClass() {
MyClass obj;
//work with obj, set values...
return obj;
}
据我了解,您创建一个新对象,复制该对象,销毁第一个对象并返回复制的对象。所以我创建了两个对象,但我只需要一个。对吗?
解决方案2在堆上创建对象并使用指针
MyClass* getMyClass() {
MyClass* obj = new MyClass();
//work with obj, set values...
return obj;
}
这似乎是最糟糕的解决方案,您必须自己进行内存管理。
解决方案3将对象作为参数传递
MyClass getMyClass(MyClass& obj) {
//work with obj, set values...
return obj;
}
您创建一个默认对象并在函数中设置所有值。
我也想过使用unique_ptr<MyCLass>,但也有同样的问题,当函数范围离开时unique_ptr被销毁。
【问题讨论】:
-
你应该考虑 shared_ptr cplusplus.com/reference/memory/shared_ptr 也可以使用移动语义cplusplus.com/reference/algorithm/move
-
在解决方案 1 的情况下,编译器应该能够应用命名返回值优化并在其最终目的地构造对象。
-
对于解决方案 2,请使用
std::shared_ptr。这三种解决方案都有自己的用例,一般来说没有一个更喜欢。 -
@Dlotan 不,如果你想要共享所有权,你应该只考虑
shared_ptr。这种情况很少见。 -
“当函数作用域离开时
unique_ptr被销毁”——除非你从函数中返回它。unique_ptr是可移动的。