std::unique_ptr 是为数组分配内存的错误工具吗?



我有一个(例如)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

相关内容

  • 没有找到相关文章

最新更新