C++ - 智能指针 - 访问冲突读取位置0xDDDDDDDD



我目前正在为旧代码创建一个测试,并在运行测试时遇到此错误消息(见下文(:

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(。选项:

  1. 使用shared_ptr并将其复制到Init中(不要重置它,只需分配deviceCtl = control;(。
  2. 通过unique_ptr使用这个SO问题的方法注入。

最新更新