我有一个(例如)uint8_t
s的数组。
std::unique_ptr
用于管理内存中的此对象的工具是否错误?
例如
std::unique_ptr<uint8_t> data(new uint8_t[100]);
这会产生未定义的行为吗?
我想要一个智能指针对象来为我管理一些分配的内存。 std::vector
并不理想,因为它是一个动态对象。 std::array
也不好,因为在编译时不知道分配的大小。我无法使用[目前,2016-03-06]实验性std::dynarray
,因为这在Visual Studio 2013上尚不可用。
不幸的是,我必须遵守VS2013,因为,规则。
您使用unique_ptr
的方式确实会导致未定义的行为,因为它会delete
托管指针,但您希望它改为delete[]
。 unique_ptr
对数组类型进行了部分专用化,以处理此类情况。你需要的是
std::unique_ptr<uint8_t[]> data(new uint8_t[100]);
您也可以为此使用make_unique
auto data = std::make_unique<uint8_t[]>(100);
然而,两者之间有一个微妙的区别。使用 make_unique
将使数组初始化为零,而第一种方法不会。
当然unique_ptr
因为你使用了它是不正确的,因为它会调用delete
而不是delete[]
来释放内存。
这种情况的正常解决方案是 std::vector
:它分配和管理您的内存,并提供一个相当强大的界面。您说您不想使用 vector
,因为我从中推断您正在向类的接口公开容器类型的实现详细信息True, but would be risky to expose that functionality to the user.
。 这才是你真正的问题。
因此,请使用vector
来管理内存,但不要直接在类界面中公开vector
。