应该函数返回"新"对象

Dut*_*n18 1 c++ pointers return function heap-memory

应该是一个函数返回指向堆上分配的内存的指针吗?

换句话说,下列哪种方法更"正确"?

// 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
}
Run Code Online (Sandbox Code Playgroud)

我想第一种方法可能更快,但第二种方法不需要用户删除对象.

Dav*_*rtz 9

在这两者中,第二个是首选.裸指针应该永远是你的最后选择.但理想情况下,你只会Object按价值回报.如果做不到这一点,除非你确实需要共享所有权,否则unique_ptr会比a更好shared_ptr.

我想第一种方法可能更快.

这可能是真的shared_ptr.但是unique_ptr,编译器可以优化.由于手动删除的风险,没有任何好处可以帮助您.

  • +1表示*"理想情况下,您只需按值返回`Object`."*.不太熟悉C++的人有时候并没有意识到返回一个对象的副值通常是[优化来消除临时对象](https://en.wikipedia.org/wiki/Return_value_optimization),因此比返回更有效率指向堆分配对象的指针. (2认同)