मैं परीक्षण के लिए GoogleMock/GoogleTest का उपयोग करता हूं, और मुझे कुछ अजीब व्यवहार दिखाई दे रहा है जब एक matcher के पास पैरामीटर के रूप में एक mock के लिए shared_ptr है, और EXPECT को उसी साझा_प्टर पर कॉल किया जाता है। कोड का उल्लंघन करने वाला टुकड़ा:GoogleMock मेरा साझा_ptr क्यों लीक कर रहा है?
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>
using namespace boost;
using namespace testing;
struct MyParameter
{
virtual ~MyParameter() {}
virtual void myMethod() = 0;
};
struct MyParameterMock : public MyParameter
{
MOCK_METHOD0(myMethod, void());
};
struct MyClass
{
virtual ~MyClass() {}
virtual void myMethod(shared_ptr<MyParameter> p) {}
};
struct MyClassMock : public MyClass
{
MOCK_METHOD1(myMethod, void(shared_ptr<MyParameter>));
};
TEST(LeakTest, GoogleMockLeaksMatchedPointer)
{
shared_ptr<MyClassMock> c = make_shared<MyClassMock>();
shared_ptr<MyParameterMock> p = make_shared<MyParameterMock>();
{
InSequence dummy;
EXPECT_CALL(*c, myMethod(Eq(p)));
EXPECT_CALL(*p, myMethod());
}
c->myMethod(p);
p->myMethod();
}
जब इस परीक्षण चलाया जाता है, मैं
leak_ptr_mock.cpp:37: ERROR: this mock object (used in test LeakTest.GoogleMockLeaksMatchedPointer) should be deleted but never is. Its address is @0x9309544.
ERROR: 1 leaked mock object found at program exit.
क्यों ऐसा होता है की कोई भी विचार? मुझे Mock::AllowLeak
का उपयोग नहीं करना है।
यह काम करता है, फ्रेजर आभासी विनाशकर्ता
MyClass::myMethod
होना चाहिए आभासी होना चाहिए! मैंने आपके सुझावों के अनुसार कोड को भी सही किया। –@bruno nery: GoogleMock का कौन सा संस्करण आप उपयोग कर रहे हैं? –
सी से पहले पी बनाया गया तो क्या होगा? अंत सी को नष्ट नहीं किया जाएगा, इसकी अपेक्षाओं को सत्यापित और साफ़ किया गया है जो पी के संदर्भ काउंटर को कम करने में नेतृत्व करेगा। काउंटर के बाद अब पी नष्ट हो जाएगा, सत्यापित और पूरी तरह से नष्ट हो जाएगा। –