2009-09-22 68 views
1

很遺憾,我沒有機會在實際開發中使用智能指針(監督員認爲這太複雜了,浪費時間)。然而,我計劃將它們用於我自己的東西...C++和智能指針 - 智能指針如何在這種情況下提供幫助?

我有關於在完成後刪除模塊或加載新數據時的情況。當我使用指針時,我發現我的代碼充滿了檢查空像這樣...

// TODO: Reset all opened windows 

// Deinit track result player 
if (trackResultPlayer_) 
    trackResultPlayer_->reset(); 

// disconnect track result player 
disconnect(trackResultPlayer_); 

disconnect(trackResultAnimator_); 
} 

if (videoPlayerWindow_) 
{ 
    videoPlayerWindow_->reset(); 

    // Disconnect the video player window from source movie data 
    disconnect(videoPlayerWindow_); 
} 

// Disconnect this module from its children as they would be connected again 
disconnect(this); 

如果我使用智能指針,而不是原始指針,怎麼可能這個問題有所緩解?

+0

請記住,新的不返回NULL(除非你明確要求)。 – 2009-09-22 16:02:00

回答

4

讓每個類都實現執行所有你需要的那類清理/去初始化析構函數。

創建類的實例,並在boost::shared_ptr包裹。

然後將其副本傳遞給需要訪問實例的每個函數。

和智能指針將確保一旦對象不再使用(當所有的共享指針已被銷燬),它們指向的對象被銷燬。它的析構函數被運行,並且所有的清理都被執行。

與往常一樣,在C++中,儘可能使用RAII。

每當你有像x.reset()disconnect(x)這樣的代碼時,你應該做的第一件事就是問自己「這不屬於析構函數嗎?」

此外,只要您使用x->y()你應該問自己:

  • 爲什麼這是一個指針?難道我不能使用堆棧中分配的單個實例嗎?也許可以參考一下嗎?
  • 如果它必須是一個指針,爲什麼它不是一個智能指針?
2

智能指針主要是管理指向內存的工具。他們的目的不是爲東西,這將釋放你從NULL值檢查的負擔......

在你的示例代碼,我沒有看到智能指針減少代碼的複雜性很大的潛力,除非你像移動電話videoPlayerWindow_->reset(),disconnect(videoPlayerWindow_)等分成類的析構函數,videoPlayerWindow是一個實例。對NULL

+0

-1。智能指針用於(並推薦)用於管理可由多個所有者共享的任何類型的資源,而不僅僅是內存。 「它們並不意味着什麼,它可以讓你擺脫NULL值檢查的負擔」:通常情況是這樣,但在這種特定情況下,NULL檢查是查看是否需要清理,哪些智能指針具有適當的析構函數*將會*照顧。 「我沒有看到智能指針降低代碼複雜度的潛力,除非......」LOL!比較:「除非你吃它,否則我在食物中看不到多少點。」 – 2009-09-22 11:54:24

+1

我想我提到了析構函數。我無法從OP給出的代碼中推斷出使用析構函數進行清理實際上是否是一種可行的方法。 – Dirk 2009-09-22 12:59:57

+0

我想我們不同意 - 對我來說,OP的代碼正在呼籲將這些「if」塊的內容放入析構函數(特別是指針正在測試NULL的類的析構函數)。 – 2009-09-23 02:45:31

2

檢查是不是一個問題 - 和智能指針不與干預反正。