将指针传递给期望向量的函数

时间:2015-10-03 07:32:40

标签: c++ pointers vector

有一些我无法编​​辑的功能,它具有以下声明:

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'不是一个选项。 我希望它是线程安全的

2 个答案:

答案 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);
}