2017-02-16 14 views
2

Я работаю с каркасом черного ящика (cdg), который заполняет массив uint32_t со значениями. вызов выглядит так:Передача исходного указателя массива на unique_ptr

std::size_t dataCount = 100; 
uint32_t* data = new uint32_t[dataCount]; 
cdg.generate(data); 

К сожалению, рамки не использовать шаблоны, так что я должен пройти в uint32_t*. Чтобы избавиться от необработанного указателя, я хочу «обернуть» его в std::unique_ptr<uint32_t>. Таким образом, я думаю, что мне нужно использовать std::unique_ptr<uint32_t[]>. Есть ли способ, чтобы преобразовать сырой указатель в unique_ptr или я должен сделать что-то вроде этого:

const std::size_t dataCount = 100; 
std::unique_ptr<uint32_t[]> data = std::make_unique<uint_32_t[]>(dataCount); 
cdg.generate(data.get()); 
+2

Использовать 'std :: vector' и' std :: vector :: data() '? – BoBTFish

+1

Почему бы не использовать вектор uint32_t? – finlaybob

+3

И если 'dataCount' постоянный, используйте' std :: array' – gurka

ответ

6

Интеллектуальные указатели являются большими и все, но, возможно, рассмотреть вопрос об использовании std::vector, так как вы обратите внимание, что это массив.

Вы можете получить указатель на данные как на массив C (для вашего устаревшего интерфейса) с data().

std::vector<uint32_t> nums(100); // creates a vector of size 100 
uint32_t *ptr = nums.data(); 
cdg.generate(ptr);     // passes uint32_t* as needed 

Если вам необходимо обеспечить уникальное владение, unique_ptr является правильным выбором. Но это звучало так, будто вы действительно просто хотели что-то, что очистит ваш массив, но все равно дает необработанный указатель на методы C.

+0

Массив должен обрабатываться количеством «рабочих». Для этого я хочу «разбить» массив и передать его таким работникам: std :: size_t workerCount = 10; std :: size_t workCount = dataCount/workerCount; for (std :: size_t i = 0; i Hymir

+0

Да, как указано в документах [data()] (http://en.cppreference.com/w/cpp/container/vector/data), выражение 'data() + offset' действительно, пока смещение меньше, чем 'size()' –

+0

. Нет проблем с параллельной работой в данных 'std :: vector', если вы не переделываете или не добавляете в нее записи. – Wolf