我目前正在为旧代码创建一个测试,并在运行测试时遇到此错误消息(见下文(:
Exception thrown at 0x0F5001EF (Control.dll) in sample.exe:
0xC0000005: Access violation reading location 0xDDDDDDDD.
我知道0xDDDDDDDD意味着代码正在尝试访问已删除的指针。 但我不明白的是它在哪里被"过早"删除。
我把它保持在最低限度。这是我的代码
CDevice::CDevice()
{
numLedRows = numLedCols = 0;
}
CDevice::~CDevice()
{
std::cout << "destructor!" << std::endl;
}
HRESULT CDevice::Init(IDevice* control)
{
HRESULT hr = S_OK;
deviceCtl.reset(control);
return hr;
}
哪里:
std::unique_ptr<IDevice> deviceCtl;
而我的测试:
TEST_F(deviceControlTest, test2)
{
sut_->Init(deviceMock_.get());
}
哪里
std::unique_ptr<CDevice> sut_;
std::unique_ptr<DeviceMock> deviceMock_;
并在设置中...
sut_ = std::make_unique<CDevice>();
deviceMock_ = std::make_unique<DeviceMock>();
我也尝试将shared_ptr用于DeviceMock,相同的行为。
我的代码有问题吗?还是我的考验??任何建议将不胜感激!
我认为您在这里有双重删除问题:deviceMock_
和deviceCtl
都在处理相同的指针。它被删除两次(是否是唯一和共享的ptr无关紧要(,一次是在调用dtor时CDevice
它是成员,包括使用的智能ptr,一次是在调用dtor deviceControlTest
一次。请注意,在 gtest 中,每个测试的调用顺序始终相同:测试套件 ctor、测试套件设置、测试主体、测试套件拆解、测试套件 dtor(。选项:
- 使用shared_ptr并将其复制到
Init
中(不要重置它,只需分配deviceCtl = control;
(。 - 通过unique_ptr使用这个SO问题的方法注入。