Как да получа размера на масива, съхранен в 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