【发布时间】:2017-09-10 23:44:08
【问题描述】:
函数是否应该返回指向在堆上分配的内存的指针?
也就是说,以下哪种方法更“正确”?
// Method #1
Object* getObject1() {
return new Object();
}
// Method #2
std::shared_ptr<Object> getObject2() {
return std::make_shared<Object>();
}
int main() {
// Usage of method #1
Object* o1 = getObject1();
o1->doSomething();
delete o1; // object has to be deleted by user
// Usage of method #2
std::shared_ptr<Object>& o2 getObject2(); // has to be kept in shared_ptr
o2.get()->doSomething();
// object is deleted when o2 destructs
}
我想第一种方法可能更快,但第二种方法不需要用户删除对象。
【问题讨论】:
-
为什么第一种方法应该“更快”?您是否试图在紧密循环中每秒调用一百万次?
-
第一个解决方案在现代 c++ 中没有一席之地。至少,它应该创建并返回一个
std::unique_ptr<Object>。 -
还有方法3,返回
std::unique_ptr<Object>。如果不确定,请这样做。没有开销,您始终可以将唯一指针转换为共享指针(在进程中使用它)。此外,您不能忘记删除unique_ptr。 -
Herb Sutter - 对象工厂:herbsutter.com/2013/05/30/gotw-90-solution-factories
-
@ChristianHackl,为什么不呢?
标签: c++ function pointers return heap-memory