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

时间:2019-05-27 10:11:07

标签: c++ pointers googletest

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

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,同样的行为。

我的代码有问题吗?还是我的测试? 任何建议将不胜感激!

1 个答案:

答案 0 :(得分:0)

我认为您在这里存在双重删除问题:deviceMock_deviceCtl都在处理相同的指针。调用CDevice dtor及其成员(包括使用的智能ptr)和调用deviceControlTest dtor时,将其删除两次(无论是唯一共享ptr都无关紧要)。请注意,在gtest中,每个测试的调用顺序始终相同:测试套件ctor,测试套件设置,测试主体,测试套件拆卸,测试套件dtor)。选项:

  1. 使用shared_ptr并将其复制到Init内(不要重置它,只需分配deviceCtl = control;)。
  2. 使用方法from this SO question.通过unique_ptr注入