Как получить размер массива, хранящийся в unique_ptr?

if I do:

std::unique_ptr<int[]> uparr(new int[1984]);

и я передаю uparr кому-то, не передавая им 1984, могут ли они увидеть, сколько в нем элементов?
иначе есть ли эквивалент вектора .size() для unique_ptr массива?


person NoSenseEtAl    schedule 26.03.2014    source источник


Ответы (2)


Нет, нет. Динамические массивы — несколько дефектная функция языка. По сути, вам всегда нужно/нужно передавать длину массива отдельно (если только у вас нет какой-либо дозорной политики). Таким образом, вы можете также использовать std::vector (если вы не возражаете против дополнительного слова для емкости).

person Kerrek SB    schedule 26.03.2014
comment
на самом деле это 2 дополнительных слова, одно для размера, одно для емкости :) - person NoSenseEtAl; 26.03.2014
comment
@NoSenseEtAl: Как только что говорилось, размер — это то, что вам нужно. Только емкость избыточна для одноразового динамического массива фиксированного размера. - person Kerrek SB; 26.03.2014
comment
На самом деле это зависит от реализации, даже если большая часть реализации представляет собой три указателя в случае распределителя без сохранения состояния, нет никакой гарантии. - person galop1n; 26.03.2014
comment
Если вы используете std::vector, вы не можете передать буфер функциям, которые работают с массивом байтов, или есть способ? - person FruitBreak; 28.09.2015
comment
@FruitBreak: Почему бы и нет? Хранилище векторов гарантированно будет непрерывным. - person Kerrek SB; 28.09.2015

Нет, информация потеряна.

Если вам нужно отслеживать его, используйте вместо этого вектор или, если вам действительно не нужны дополнительные услуги, напишите небольшую оболочку вокруг выделенного массива. Например, вы можете посмотреть на предложение std::dynarray, которое было выведено из стандарта c++1y.

person galop1n    schedule 26.03.2014