【发布时间】:2019-04-07 15:33:35
【问题描述】:
我有一个将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()),错误信息变为
双重释放或损坏(fasttop):0xb75c1e18
非常感谢任何帮助。
【问题讨论】:
-
将
unique_ptr指向自动存储中的对象而不提供无操作删除器是一个坏主意。不要删除堆栈。 -
如果不是新的,请不要删除。
-
提供的 sn-p 是我的单元测试的全部内容。我没有明确删除任何内容,所以我不确定如何避免 implicit 删除。
-
@MatinKh
unique_ptr析构函数delete[]是默认保持的指针,除非您提供不同的deleter。
标签: c++ c++11 unique-ptr