在测试中使用unique_ptr时出现无效的指针错误

时间:2019-04-07 15:33:36

标签: c++ c++11 unique-ptr

我有一个采用std::unique_ptr<uint8_t[]>作为输入并对其进行处理的方法。在我的单元测试中,

这是我创建和初始化此参数的方式:(在 stack 上)

uint8_t testBytes[] = {1, 2, 3, 4};
std::unique_ptr<uint8_t[]> testBytesPtr = std::make_unique<uint8_t[]>(4);
testBytesPtr.reset(testBytes);

它被传递给像这样的方法

myClass.processData(std::move(testBytesPtr));

单元测试结束时,出现以下错误消息:

  

free():无效的指针:0xbed6b8c0


这是我的单元测试的样子:

#include "gtest.h"
#include "gmock.h" // for some deps

//...

TEST(MyClassUnittests, test1) {
    // Initializing the byte array.
    uint8_t testBytes[] = {1, 2, 3, 4};
    std::unique_ptr<uint8_t[]> testBytesPtr = std::make_unique<uint8_t[]>(4);
    testBytesPtr.reset(testBytes);

    EXPECT_TRUE(myClass.processData(std::move(testBytestPtr));
}

我还应该注意,如果testBytes是在上初始化的(例如uint8_t* testBytes = new uint8_t()),则错误消息将变为

  

双重释放或破坏(快速删除):0xb75c1e18

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

delete []-严格禁止使用非new []版本或您没有的东西。

看看这些行:

uint8_t testBytes[] = {1, 2, 3, 4};
std::unique_ptr<uint8_t[]> testBytesPtr = std::make_unique<uint8_t[]>(4);
testBytesPtr.reset(testBytes);

删除不相关的临时动态分配将导致:

uint8_t testBytes[] = {1, 2, 3, 4};
std::unique_ptr<uint8_t[]> testBytesPtr(testBytes);

当dtor插入时,这会导致未定义的行为。

诚然,您只需移动std::unique_ptr一次,但这只会改变爆炸发生的确切时间。

考虑要测试的功能,请尝试以下操作以获取正确分配的测试数据副本:

uint8_t testBytes[] = {1, 2, 3, 4};
auto testBytesPtr = std::make_unique<uint8_t[]>(std::size(testBytes));
std::copy(std::begin(testBytes), std::end(testBytes), &testBytesPtr[0]);