2010-11-24 46 views
2

我正在爲遊戲創建一個gui api。例如,我爲每個小部件以Font *形式提供了一個字體。現在我擁有它,所以我從來不管理這些內存(出於顯而易見的原因),因爲我認爲如果用戶希望管理內存,用戶可以使用智能指針。對此的認可是它不是非常愚蠢的證據。如果用戶像這樣設置字體:傳遞指向類的指針時,誰應該管理資源?

obj.setFont(new Font("")); 

這會立即導致內存泄漏,因爲沒有人會釋放它。唯一的方法是刪除getFont();

對我來說管理這些會更好嗎?

感謝

+1

每常量引用獲取參數在可能的情況,在其他地方使用智能指針,定義什麼情況下什麼其他情況下(即如何定義對象的壽命)認真擁有。 – gimpf 2010-11-24 15:49:11

+2

你不能對某人輸入這個內容負責:`obj.setFont(new Font(「」));`不僅僅是你可以爲某人在自己的一行上輸入新的Font(「」);`負責。 – 2010-11-24 15:56:23

回答

2

它應該是來電者的責任管理是主叫方的範圍內的對象的內存。

話雖這麼說,在這種情況下,你應該使用智能指針,因爲他們會收回自己,當他們不再使用。

+0

對指針的const引用? – jmasterx 2010-11-24 15:53:25

1

這就是所有權轉讓的問題。

但:您可以將接口改寫爲

void obj.setFont(SmartPtr<Font> font); 

,因爲那時你正迫使用戶使用智能指針。

3

這是你的決定,如果您的圖書館應採取資源的所有權,但無論你選擇,使其通過界面清晰(而不是僅僅通過評論或文檔)。

  • 在C++ 03,一個很好的方式,清楚你實際上是取得所有權是接收參數爲std::auto_ptr:客戶端將毫無疑問,他將所有權轉移
  • 在對面,通過const引用接收一個參數應該說明你沒有打算永遠刪除數據(你不可能知道它是否真的被新增了)。

不管怎樣,去爲智能指針可能會帶着這些問題有所幫助。