在测试中使用 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]);
我有一个方法将 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]);