Does C++11 have wrappers for dynamically-allocated arrays like Boost's scoped_array?
Asked Answered
J

2

28

I often need to deal with dynamically-allocated arrays in C++, and hence rely on Boost for scoped_array, shared_array, and the like. After reading through Stroustrup's C++11 FAQ and the C++11 Reference Wiki, I could not find a suitable replacement for these dynamic array wrappers that is provided by the C++11 standard. Is there something that I have overlooked, or do I have to continue relying on Boost?

Joslin answered 24/12, 2011 at 11:8 Comment(0)
F
50

There is a specialization of unique_ptr, like unique_ptr<T[]>.

#include <iostream>
#include <memory>

struct test
{
  ~test() { std::cout << "test::dtor" << std::endl; }
};

int main()
{
  std::unique_ptr<test[]> array(new test[3]);
}

When you run it, you will get this messages.

test::dtor
test::dtor
test::dtor

If you want to use shared_ptr, you should use std::default_delete<T[]> for deleter since it doesn't have one like shared_ptr<t[]>.

std::shared_ptr<test> array(new test[3], std::default_delete<test[]>());
Ferrous answered 24/12, 2011 at 13:39 Comment(1)
That specialization also provides T& operator[](size_t) to access the members.Kktp
R
0

So far as vectors are intended as array wrappers, what if you use any suitable smart pointer with the vector as inner object?

Rottenstone answered 10/2, 2015 at 18:12 Comment(2)
vector::emplace_back() and vector::push_back() won't work if the element type is not copy-constructible. I don't know about initializing with an initializer list, but i suspect that has the same problem.Citarella
Yep, you're right, in that case we need to wrap such non-copyable things with extra wrapper, that tends to be some overkill indeed :)Rottenstone

© 2022 - 2024 — McMap. All rights reserved.