2012-09-06 38 views
8

對於這種特殊場景,我無法擺脫泄漏。將GoogleMock與Boost :: Shared Pointer一起使用時漏出的模擬對象

我在執行測試時收到泄漏模擬對象的消息。具體的消息:

ClassElementFixture.h:102:錯誤:這個模擬對象(在測試ClassElementFixture.initialize中使用)應該被刪除,但從來沒有。它的地址是@ 0x940a650。

我標記了錯誤引用的行。 這裏的簡化版本我的代碼:

... 
class ClassElementFixture: public ::testing::Test 
{ 
    public: 
     boost::shared_ptr<fesa::ClassElement> classElement_; 
     boost::shared_ptr<fesa::DeviceElementMock> deviceElement_; 

     ... 

     void SetUp() 
     { 
      classElement_.reset(new fesa::ClassElement()); 
     } 

     void TearDown() 
     { 
     } 

     void initializeFake() 
     { 
      fesa::ParserElementFactoryMock factory; 
      deviceElement_.reset(new fesa::DeviceElementMock()); 

      EXPECT_CALL(factory, createDeviceElement(_)) 
         .WillOnce(Return(deviceElement1_)); 
      EXPECT_CALL(*deviceElement_, initialize(_));//Error refers to here 

      classElement_->initialize(factory); 

      EXPECT_TRUE(Mock::VerifyAndClearExpectations(deviceElement_.get())); 
     } 
} 

我已經找到 Why is GoogleMock leaking my shared_ptr?

在棧溢出,這是關係。但是從那裏的建議沒有解決我的問題:X

我發現,爲了至少抑制誤差的唯一可能性是:

Mock::AllowLeak(deviceElement_.get()); 

然而,這並不是一個很乾淨的解決方案=)

那麼如何正確擺脫泄漏?

+0

我使用谷歌模擬v1.6.0以及谷歌測試v1.6.0 – Alex

+5

你試過重置()在'TearDown()'shared_ptrs? –

+2

你的shared_ptr關係中有一個循環嗎?共享指針存在一個已知問題,週期會導致泄漏。 –

回答

3

如果你使用智能指針,你仍然需要明確所有權,否則你可能會得到糟糕的性能,循環依賴和內存泄漏。

我建議智能指針的默認選擇應該是unique_ptr獨特的所有權和觀察員使用原始指針。

如果觀察者可能會超過擁有者,那麼對於所有者將移動到一個shared_ptr,對於觀察者移動到weak_ptr

當你沒有一個明確的擁有者並且小心循環依賴時,只能使用「共享」shared_ptr作爲最後的手段。

2

請勿使用共享指針。或者如果你真的必須使用它們,確保它們回到0並在測試結束時被銷燬。

1

這是一個古老的問題,但我沒有看到任何人提到我剛剛找到的解決方案。

我看到相同的錯誤,直到我添加一個虛擬析構函數給我嘲笑的類。在你的情況下,確保在ParserElementFactoryMock上有一個虛擬析構函數。有道理,因爲沒有虛擬析構函數,模擬對象在超出範圍時不會釋放資源。

相關問題