From 7c95d8346e9c62e9d6d7e8202fbcfb34c4404db9 Mon Sep 17 00:00:00 2001 From: "zhanyong.wan" Date: Thu, 1 Oct 2009 21:56:16 +0000 Subject: [PATCH] Works around a Symbian compiler bug that causes memory leak (by Mika Raento). --- include/gmock/gmock-spec-builders.h | 13 ++++++++++--- src/gmock-spec-builders.cc | 8 ++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/include/gmock/gmock-spec-builders.h b/include/gmock/gmock-spec-builders.h index 0748d9d4..765e06d9 100644 --- a/include/gmock/gmock-spec-builders.h +++ b/include/gmock/gmock-spec-builders.h @@ -351,10 +351,18 @@ class Mock { // - Constness is shallow: a const Expectation object itself cannot // be modified, but the mutable methods of the ExpectationBase // object it references can be called via expectation_base(). +// - The constructors and destructor are defined out-of-line because +// the Symbian WINSCW compiler wants to otherwise instantiate them +// when it sees this class definition, at which point it doesn't have +// ExpectationBase available yet, leading to incorrect destruction +// in the linked_ptr (or compilation errors if using a checking +// linked_ptr). class Expectation { public: // Constructs a null object that doesn't reference any expectation. - Expectation() {} + Expectation(); + + ~Expectation(); // This single-argument ctor must not be explicit, in order to support the // Expectation e = EXPECT_CALL(...); @@ -399,8 +407,7 @@ class Expectation { typedef ::std::set Set; Expectation( - const internal::linked_ptr& expectation_base) : - expectation_base_(expectation_base) {} + const internal::linked_ptr& expectation_base); // Returns the expectation this object references. const internal::linked_ptr& diff --git a/src/gmock-spec-builders.cc b/src/gmock-spec-builders.cc index 72558658..6cc94ddd 100644 --- a/src/gmock-spec-builders.cc +++ b/src/gmock-spec-builders.cc @@ -420,6 +420,14 @@ void Mock::ClearDefaultActionsLocked(void* mock_obj) { // needed by VerifyAndClearExpectationsLocked(). } +Expectation::Expectation() {} + +Expectation::Expectation( + const internal::linked_ptr& expectation_base) + : expectation_base_(expectation_base) {} + +Expectation::~Expectation() {} + // Adds an expectation to a sequence. void Sequence::AddExpectation(const Expectation& expectation) const { if (*last_expectation_ != expectation) {