2012-09-06 22 views
8

इस विशेष परिदृश्य के लिए, मैं लीक से छुटकारा पाने में सक्षम नहीं हूं।बूस्ट के साथ GoogleMock का उपयोग करते समय लीक मॉक ऑब्जेक्ट्स :: साझा पॉइंटर्स

मुझे परीक्षण निष्पादित करते समय लीक मॉक ऑब्जेक्ट का संदेश मिलता है। कंक्रीट संदेश:

क्लासइलेमेंटफिक्चर.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?

। लेकिन वहाँ से सुझाव मेरी समस्या हल नहीं होती: एक्स

केवल संभावना जो मैं कम से कम त्रुटि को दबाने के लिए आदेश में पाया, यह है:

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

हालांकि यह एक बहुत ही स्वच्छ समाधान नहीं है =)

तो लीक से ठीक से कैसे छुटकारा पाएं?

+0

मैं google-mock v1.6.0 का उपयोग करता हूं और साथ ही google-test v1.6.0 – Alex

+5

क्या आपने 'TearDown()' में shared_ptrs को रीसेट करने का प्रयास किया है? –

+2

क्या आपके पास अपने साझा_पीटीआर संबंधों में एक चक्र है? साझा पॉइंटर्स के साथ एक ज्ञात समस्या है जहां चक्र लीक का कारण बन सकते हैं। –

उत्तर

3

यदि आप स्मार्ट पॉइंटर्स का उपयोग करते हैं, तो आपको अभी भी स्वामित्व का स्पष्ट विचार होना चाहिए अन्यथा आप खराब प्रदर्शन, चक्रीय निर्भरता और मेमोरी लीक प्राप्त कर सकते हैं।

मेरा सुझाव है कि स्मार्ट पॉइंटर की डिफ़ॉल्ट पसंद unique_ptr अद्वितीय स्वामित्व के लिए हो और पर्यवेक्षकों के लिए कच्चे पॉइंटर्स का उपयोग करें।

यदि पर्यवेक्षक संभावित रूप से मालिक से बाहर निकल सकते हैं तो पर्यवेक्षकों के लिए मालिक के लिए shared_ptr और weak_ptr पर जाएं।

अंतिम उपाय के रूप में केवल "साझा" shared_ptr का उपयोग करें जब आपके पास एक स्पष्ट स्वामी नहीं है और चक्रीय निर्भरताओं से सावधान रहें।

2

साझा पॉइंटर्स का उपयोग न करें। या यदि आपको वास्तव में उनका उपयोग करना है तो सुनिश्चित करें कि वे 0 तक वापस पहुंचें और परीक्षण के अंत में नष्ट हो जाएं।

1

यह एक पुराना सवाल है, लेकिन मुझे किसी भी समाधान का उल्लेख करने वाला कोई भी व्यक्ति नहीं दिख रहा है।

मैंने वही त्रुटि देखी जब तक कि मैंने कक्षा में वर्चुअल विनाशक जोड़ा जो मैं मजाक कर रहा था। अपने मामले में, सुनिश्चित करें कि आपके पास ParserElementFactoryMock पर आभासी विनाशक है। समझ में आता है, क्योंकि वर्चुअल विनाशक के बिना मॉक ऑब्जेक्ट दायरे से बाहर निकलने पर अपने संसाधनों को मुक्त नहीं करेगा।