2017-02-16 1 views
2

나는 uint32_t 배열에 값을 채우는 블랙 박스 프레임 워크 (cdg)를 사용하고있다. 통화가 그 다음과 같습니다배열의 원시 포인터를 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을 사용하는 것이 좋습니다.

data()으로 C 배열 (기존 인터페이스 용)이었던 것처럼 데이터에 대한 포인터를 얻을 수 있습니다.

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

어레이는 "worker"만큼 처리되어야합니다. 이렇게하려면 배열을 "분할하여"그와 같은 작업자에게 전달하고 싶습니다. std :: size_t workerCount = 10; std :: size_t workCount = dataCount/workerCount; (std :: size_t i = 0; i Hymir

+0

예, [data()] (http://en.cppreference.com/w/cpp/container/vector/data) 문서에 명시된 바와 같이 'data() + offset'표현식은 유효합니다. offset이'size()'보다 작습니다. –

+0

'std :: vector'의 데이터에서 항목을 이동하거나 추가하지 않는 한 병행 작업에는 아무런 문제가 없습니다. – Wolf

관련 문제