2016-03-06 21 views
1

我有一个(例如)uint8_t s的数组。是std :: unique_ptr为数组分配内存的错误工具?

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,因为规则。

+1

你知道你可以使用[构造函数](http://en.cppreference.com/w/cpp/container/vector/vector)或手动[调整大小]设置矢量的大小, (http://en.cppreference.com/w/cpp/container/vector/resize)。所以你仍然可以将它用作“一次性动态数组”。 –

+3

“'std :: vector'不理想,因为它是一个动态对象” - 为什么这会是一个量级问题,让你尝试手动内存管理和/或实验性功能呢? – DevSolar

+0

有能力调整内存大小,甚至在分配后清除内存的人将会是一个严重的问题。 – user3728501

回答

9

您使用unique_ptr的方式确实会导致未定义的行为,因为它将delete托管指针,但您希望它是delete[] d代替。 unique_ptr有一个partial specialization for array types来处理这种情况。你需要的是

std::unique_ptr<uint8_t[]> data(new uint8_t[100]); 

您还可以使用make_unique

auto data = std::make_unique<uint8_t[]>(100); 

还有就是两者之间的细微差别,但是。使用make_unique将零初始化数组,而第一种方法不会。

2

肯定是unique_ptr因为您已经使用它是不正确的,因为它会调用delete而不是delete[]来释放内存。

这种情况的正常解决方案是std::vector:它分配和管理你的内存,并提供一个相当健壮的界面。你说你不想使用vector,因为True, but would be risky to expose that functionality to the user.从中我推断你将容器类型的实现细节公开给你的类的接口。 然后是你真正的问题。

因此,使用vector来管理内存,但不要直接在您的类接口中暴露vector