2017-02-16 71 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,因为你注意到它是一个数组。

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

该数组应该由一定数量的“工作人员”处理。为此,我想“拆分”数组并将其传递给像这样的工作人员: 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)docs中所述,只要表达式data()+ offset是有效的偏移量小于size()' –

+0

只要您不(重新)移动或追加条目到'std :: vector'的数据中,并发工作就没有问题。 – Wolf