我当前正在为旧版代码创建测试,并且在运行测试时遇到此错误消息(见下文):
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>();
我也尝试过对DeviceMock使用shared_ptr,同样的行为。
我的代码有问题吗?还是我的测试? 任何建议将不胜感激!
答案 0 :(得分:0)
我认为您在这里存在双重删除问题:deviceMock_
和deviceCtl
都在处理相同的指针。调用CDevice
dtor及其成员(包括使用的智能ptr)和调用deviceControlTest
dtor时,将其删除两次(无论是唯一共享ptr都无关紧要)。请注意,在gtest中,每个测试的调用顺序始终相同:测试套件ctor,测试套件设置,测试主体,测试套件拆卸,测试套件dtor)。选项:
Init
内(不要重置它,只需分配deviceCtl = control;
)。