私はテストのためにGoogleMock/GoogleTestを使いました。マッチャーがmockにshared_ptrをパラメータとして持っていて、同じshared_ptrでEXPECTが呼び出されたときに、いくつかの奇妙な動作が見られました。コードの問題ピース:GoogleMockでshared_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
を使用する必要はありません。
でなければなりませんgmockの機能をオーバーライドすることを可能にするために仮想なければなりません仮想デストラクタ
MyClass::myMethod
を持っている必要があります!あなたの提案に従ってコードを修正しました。 –@ bruno nery:どのバージョンのGoogleMockを使用していますか? –
pがcより前に作成されるとどうなりますか?最終的に破壊されるよりも、その期待が検証され、クリアされて、pの参照カウンターを減少させるであろう。その後、カウンタは0になっているので、pは破壊され、検証され、完全に破壊されます。 –