繁体   English   中英

从std :: unique_ptr数组中获取原始指针数组

[英]Get array of raw pointers from array of std::unique_ptr

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

有没有办法使用智能指针与此库函数?

我已经尝试了这个,但它给了我一个段错误: f(reinterpret_cast<unsigned char **>(myArray[0].get()));

std::array<unsigned char* , 4> arr = { myArray[0].get(),myArray[1].get(),myArray[2].get(),myArray[3].get() };

传递arr.data()

你的演员是错的。 您正在转换存储在第一个数组元素中的unsigned char *指针。 您需要转换元素本身的地址:

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

甚至可以自己施放数组:

using puchar = unsigned char *;
f(reinterpret_cast<puchar(&)[4]>(myArray));

但是,这些只能起作用,因为std::unique_ptr被设计为没有比原始指针更多的存储开销。 但使用这些解决方案是不明确的行为。 正确的解决方案是简单地将指针复制到另一个数组,例如:

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);

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

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

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

release()https//en.cppreference.com/w/cpp/memory/unique_ptr/release

get()https//en.cppreference.com/w/cpp/memory/unique_ptr/get

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM