簡體   English   中英

目標C“自動釋放”在C ++中 - 控制對象生命周期的標准方法?

[英]Objective C “autorelease” in C++ — standard way to control object lifetime?

我正在將一些代碼從Objective C移植到C ++。 我不熟悉C ++設計模式,就像我在Objective C中一樣。在Cocoa世界中,有一種非常常見的編寫工廠方法的模式,它返回一個“自動釋放”的對象。 有些事情很簡單:

- (MyClass *)load {

    MyClass* obj = [[MyClass alloc] init];
    return [obj autorelease];
}

這很簡單易懂。 該方法擁有它分配的內存,但可以將其交還給調用者,同時放棄所有權。 它不必知道或關心調用者對該內存的作用。 如果它保留它,該對象將存活。 如果完全忽略,則在解除當前調用堆棧后的某個時間釋放內存。

我在C ++中有些惶恐不安,因為它的非重新計數環境似乎沒有像autorelease那樣干凈,或者任何類型的所有權策略都與Cocoa框架中的定義一樣。 C ++中這種模式的最佳實踐是什么?

我知道auto_ptr,但是它的使用也存在很多問題,並且它似乎有太多缺點,無法像autorelease一樣普遍存在(奇怪的復制語義,不支持數組,與STL容器不兼容等)。

提升智能指針也是一個明顯的候選者,有些甚至實現自己的引用計數。 我不得不依靠第三方圖書館來尋找這個世俗的東西,這似乎有點奇怪。

B的另一個選擇是釋放返回的內存,但是通過通常采用的命名約定來指示調用者現在擁有返回的對象。 這似乎有點陳舊,如果調用者意外忽略返回值,則容易發生隱形泄漏。

C ++ 03世界中的“最佳實踐”(即前C ++ 11)是以下兩種方式之一:

  1. 沒做什么。 這基本上是假設/慣例的內存所有權。 如果函數返回指針,您應該知道誰擁有它。 通常,文檔會告訴你。 內存所有權或轉讓所有權沒有特定的語法。

    這就是不幸的是,大量的C ++代碼管理內存。 它可以工作,只要每個人都知道他們應該做什么以及誰負責什么。

  2. 使用某種形式的智能指針。 std::auto_ptr是奇數,但它與C ++ 03中的輕量級相同。 不,您不能將它們粘貼在標准容器中,但它確實定義了特定的所有權模式。 boost::shared_ptr是一個更有效的,在許多其他地方更有用。

C ++ 11提供了std::unique_ptr ,它本質上是一個“固定”的auto_ptr 它依賴於C ++ 11語言特性(對象移動),所以你不能只用C ++ 03編寫一個。 您可以將它們存儲在標准容器和所有東西中。 但你不能只是傳遞它們。 顧名思義,它們是獨一無二的 :只有其中一個可以存在,指向該對象。 當該unique_ptr被銷毀時,它會刪除它引用的對象。

您只能通過贈送來轉移 unique_ptr所有權。 也就是說,您無法共享所有權。 您可以返回所有權,這意味着調用者現在擁有它。 您可以將所有權傳遞給另一個函數,這意味着該函數擁有它。 但是沒有兩個實體可以通過unique_ptr擁有一個對象。

unique_ptr將是處理這樣的函數的首選方法。 如果用戶想要自己非唯一地存儲它,那么他們可以將它釋放到std::shared_ptr (它也被采用到C ++ 11中)。

我會看一下boost中的shared_ptr

C ++世界都是關於圖書館的。 因為沒有人擁有 C ++(與Objective-C不同),所以它隨着社區的需要而增長。

那么最像c ++的選項就是使用智能指針..

從我讀到的,引用計數指針是你最好的選擇,在c ++ 11標准中你可以使用shared_ptr

暫無
暫無

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

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