C++ 从std::unique\u ptr数组中获取原始指针数组

C++ 从std::unique\u ptr数组中获取原始指针数组,c++,arrays,smart-pointers,C++,Arrays,Smart Pointers,我有一个库函数,它需要一个包含四个指针的数组作为参数:f(unsigned char*data[4]),我的代码中有一个智能指针数组:std::unique\u ptr myArray[4] 有没有办法将智能指针与此库函数一起使用 我已经试过了,但它给了我一个segfault:f(reinterpret_cast(myArray[0].get())std::array arr={myArray[0]。get(),myArray[1]。get(),myArray[2]。get(),myArray[

我有一个库函数,它需要一个包含四个指针的数组作为参数:
f(unsigned char*data[4])
,我的代码中有一个智能指针数组:
std::unique\u ptr myArray[4]

有没有办法将智能指针与此库函数一起使用

我已经试过了,但它给了我一个segfault:
f(reinterpret_cast(myArray[0].get())

std::array arr={myArray[0]。get(),myArray[1]。get(),myArray[2]。get(),myArray[3]。get();

传递
arr.data()

如果您确信您的
unique\u ptr
不会超出范围,并且希望它保留您可以使用的关联指针的所有权
char*a[]={myArray[0]。get(),myArray[1]。get(),myArray[2]。get(),myArray[3]。get()}
在数组中的每个指针上创建一个常规指针数组

unique_指针
保留
char*
资源的所有权,如果它们超出范围,
unique_ptr
析构函数将释放指针

如果您想释放所有权,可以在
unique\u ptr
s上使用
release()
方法,这将允许您安全地转换为常规指针,并确保超出范围的
unique\u ptr
不会释放底层char*资源

release()


get()

您的演员阵容错误。您正在强制转换存储在第一个数组元素中的
无符号字符*
指针。您需要强制转换元素本身的地址:

f(reinterpret_cast<unsigned char **>(&myArray[0]));
或:

无符号字符*myArrayOfPtrs[4];
对于(int i=0;i<4;++i){
myArrayOfPtrs[i]=myArray[i].get();
}
f(myArrayOfPtrs);
或:

#包括
无符号字符*MyArrayOfftrs[4];
std::transform(std::begin(myArray)、std::end(myArray)、std::begin(myArrayOfPtrs),
[](自动&p){返回p.get();}
);
f(myArrayOfPtrs);

将指针复制到由四个指针组成的数组中。
f(reinterpret_cast<unsigned char **>(&myArray[0]));
using puchar = unsigned char *;
f(reinterpret_cast<puchar(&)[4]>(myArray));
unsigned char* myArrayOfPtrs[] = { myArray[0].get(), myArray[1].get(), myArray[2].get(), myArray[3].get() };
f(myArrayOfPtrs);
unsigned char* myArrayOfPtrs[4];
for (int i = 0; i < 4; ++i) {
    myArrayOfPtrs[i] = myArray[i].get();
}
f(myArrayOfPtrs);
#include <algorithm>

unsigned char* myArrayOfPtrs[4];
std::transform(std::begin(myArray), std::end(myArray), std::begin(myArrayOfPtrs),
    [](auto &p) { return p.get(); }
);
f(myArrayOfPtrs);