8

この特別なシナリオでは、リークを取り除くことができません。

テストを実行すると、リークされたモックオブジェクトのメッセージが表示されます。具体的なメッセージ:

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()));
        }
}

GoogleMockがshared_ptrをリークしているのはなぜですか

関連するStack-Overflowで。しかし、そこからの提案は私の問題を解決しません:X

少なくともエラーを抑制するために私が見つけた唯一の可能性は次のとおりです。

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

ただし、これは非常にクリーンなソリューションではありません=)

では、リークを適切に取り除く方法は?

4

3 に答える 3

3

スマートポインタを使用する場合でも、所有権について明確に理解する必要があります。そうしないと、パフォーマンスの低下、循環依存、メモリリークが発生する可能性があります。

スマートポインターのデフォルトの選択はunique_ptr、一意の所有権のためであり、オブザーバーには生のポインターを使用することをお勧めします。

オブザーバーが所有者よりも長生きする可能性がある場合はshared_ptr、所有者とweak_ptrオブザーバーのいずれかに移動します。

shared_ptr明確な所有者が1人もいない場合にのみ、最後の手段として「共有」を使用し、循環依存に注意してください。

于 2014-10-25T07:08:32.190 に答える
2

共有ポインタを使用しないでください。または、本当にそれらを使用する必要がある場合は、それらが0に戻って、テストの最後に破棄されることを確認してください。

于 2013-11-27T21:51:20.030 に答える
2

これは古い質問ですが、私が見つけた解決策について言及している人は誰もいません。

嘲笑していたクラスに仮想デストラクタを追加するまで、同じエラーが発生しました。あなたの場合、ParserElementFactoryMockに仮想デストラクタがあることを確認してください。仮想デストラクタがないと、モックオブジェクトはスコープ外に出たときにリソースを解放しないため、理にかなっています。

于 2016-03-08T23:15:10.220 に答える