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

Invalid pointer error when using unique_ptr in tests

我有一个方法将 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(): invalid pointer: 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()),则错误消息变为

double free or corruption (fasttop): 0xb75c1e18

非常感谢任何帮助。

delete []-ing 不是 new []-ed 的东西,也不是您拥有的东西,是严重禁忌的。

看看这些行:

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]);