Đối với trường hợp đặc biệt này, tôi không thể loại bỏ các rò rỉ.Đối tượng giả bị rò rỉ khi sử dụng GoogleMock cùng với Boost :: Shared Pointers
Tôi nhận được thông báo của các đối tượng giả bị rò rỉ khi thực hiện kiểm tra. Thông báo cụ thể:
ClassElementFixture.h: 102: L ERI: đối tượng giả này (được sử dụng trong kiểm tra ClassElementFixture.initialize) sẽ bị xóa nhưng không bao giờ được. Địa chỉ của nó là @ 0x940a650.
Tôi đã đánh dấu dòng mà lỗi đề cập đến. Dưới đây là một phiên bản đơn giản của mã của tôi:
...
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()));
}
}
Tôi đã tìm thấy Why is GoogleMock leaking my shared_ptr?
tại Stack Overflow-, mà có liên quan. Tuy nhiên những gợi ý từ đó không khắc phục vấn đề của tôi: X
Khả năng duy nhất mà tôi thấy, để ít nhất ngăn chặn các lỗi là:
Mock::AllowLeak(deviceElement_.get());
Tuy nhiên đây không phải là một giải pháp rất sạch sẽ =)
Vậy làm cách nào để loại bỏ rò rỉ đúng cách?
Tôi sử dụng google-mock v1.6.0 và google-test v1.6.0 – Alex
bạn đã thử đặt lại() shared_ptrs trong 'TearDown()' chưa? –
Bạn có chu kỳ trong các mối quan hệ shared_ptr của mình không? Có một vấn đề đã biết với các con trỏ được chia sẻ nơi các chu kỳ có thể dẫn đến rò rỉ. –