簡體   English   中英

函數是否應該返回“新”對象

[英]Should a function return a “new” object

函數是否應該返回指向堆上分配的內存的指針?

換句話說,以下哪種方法更“正確”?

// 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
}

我想第一種方法可能更快,但是第二種方法不需要用戶刪除對象。

在這兩個中,第二個將是首選。 裸指針始終應該是您的最后選擇。 但理想情況下,您只需按值返回Object 否則,除非您確實確實需要共享所有權,否則unique_ptr會比shared_ptr更好。

我想第一種方法可能更快。

shared_ptr可能是正確的。 但是使用unique_ptr ,編譯器可以進行優化。 沒有任何好處可以補償您手動刪除的風險。

兩種選擇都沒有那么好。

默認情況下,您可以在C ++中做的最好的事情是:

Object getObject1() {
    return Object();
}

如果您確實必須使用動態分配,那么您的第一選擇應該是按值返回std::unique_ptr

std::unique_ptr<Object> getObject1() {
    return std::make_unique<Object>();
}

請參閱Herb Sutter撰寫的“ GotW#90解決方案:工廠”,以獲取有關該主題的不錯的文章。 薩特說:

  • 返回unique_ptr表示返回唯一所有權,這是純“源”工廠函數的規范。
  • unique_ptr的效率無與倫比-移動一個指針與移動/復制原始指針一樣便宜。

至於您的具體問題:

我想第一種方法可能更快

std::shared_ptr涉及鎖定以便於線程安全,因此可能會降低性能。 但是,這並不重要。 動態分配通常總是比替代方法慢,因此您通常不希望在微性能很重要的地方使用它(例如,在緊密循環中或每秒執行多次的代碼的某些部分)。 C ++不鼓勵您在免費商店中創建許多小對象。 因此,這樣的功能首先不應成為瓶頸。

他們都是正確的。 但是,在第一種情況下,創建“刪除程序”功能是個好習慣。

為什么?

因為您有一個負責分配對象的“接口”,所以您應該有另一對分配對象,一旦此函數的使用者使用您的接口,就不需要知道內部正在發生new 。例如,它可能是malloc或其他任何東西,因此這對deleter函數將實現deletefree或您必須適當取消分配的任何其他功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM