Why is GoogleMock leaking my shared_ptr?

前端 未结 1 859
说谎
说谎 2020-12-15 03:30

I use GoogleMock/GoogleTest for testing, and I\'m seeing some strange behavior when a matcher has a shared_ptr to a mock as a parameter, and EXPECT is called on the same sha

相关标签:
1条回答
  • 2020-12-15 04:10

    This is a result of holding p as a shared_ptr, using InSequence and the order in which you have declared your expectations.

    When you call

        EXPECT_CALL(*c, myMethod(Eq(p)));
    

    you increase the use_count of p. In order for the leak detection to pass, p must be destroyed at (or before) the end of TEST.

    The problem here is that internally, gmock maintains a record of the required mock call sequence by holding a pointer to the preceding expectation. So when you call EXPECT_CALL(*p, myMethod());, it gets a copy of the pointer to the previous expectation.

    This then has the effect of blocking the call to p's destructor when TEST ends.

    In order to work around this, I think your best bet is to call

        EXPECT_TRUE(Mock::VerifyAndClearExpectations(p.get()));
    

    just before you exit TEST. This clears the expectations on p, including critically its prerequisite expectation, which in turn allows the destructor of p to be invoked correctly.

    Alternatively, if the order of the mock calls is unimportant, simply removing InSequence dummy; will also allow p's destructor to execute.


    As an aside, your code has a couple of issues;

    • Your base structs should have virtual destructors
    • MyClass::myMethod should be virtual in order to allow gmock's function to override it
    • p->myMethod(p); should be p->myMethod();
    0 讨论(0)
提交回复
热议问题