[英]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函數將實現delete
或free
或您必須適當取消分配的任何其他功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.