有一些我无法编辑的功能,它具有以下声明:
void foo(std::vector<uchar>& vector_to_filled_with_data);
我想调用此函数,但我希望它能填充指针:
void method_that_would_called_from_another_place(){
uchar* to_be_filled =/*new uchar[n]*/;
foo(to_be_filled);
}
P.S。评论部分是可选的..我可以删除它或保留它。 我知道这是完全不好的行为。但是,它适用于native-manged包装器,所以我必须处理原始指针。
编辑: 我希望数据超出范围,因此'vec.data'不是一个选项。 我希望它是线程安全的
答案 0 :(得分:1)
您需要创建一个向量,创建一个数组,然后从向量中复制数据:
std::vector<uchar> to_be_filled;
foo(to_be_filled);
uchar* ptr = new uchar[to_be_filled.size()];
std::copy(to_be_filled.begin(), to_be_filled.end(), ptr);
答案 1 :(得分:0)
如果由于某种原因阵列无法触及且功能不可触及,则必须复制数据。
所以你从数组中构造向量。返回后,您需要将返回的数据复制回数组。
std::vector
拥有指向内部数据的指针。您可以交换分配器以避免它在之后释放数据,但会从std::vector<char>
更改类型。
鉴于你想要传递一个指针(没有它的大小),这个函数改变你的数组是不安全的。
所以我宁愿尝试摆脱拥有的数组或尝试让函数接受其他参数。
码
#include <vector>
void foo(std::vector<char> &data) {
data.push_back("a"); // attention overflow behaviour
}
int main (int argc, char **argv) {
using namespace std;
char arr[5] = { 'h', 'e', 'l', 'l', 'o' };
vector<char> cp(&arr[0], &arr[5]);
foo(cp);
// somehow handle buffer overflows
copy(&foo.data[0], &foo.data()[5], arr);
}