我有一个采用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
非常感谢您的帮助。
答案 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]);