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

Passing a pointer to a function expecting a vector

本文关键字:向量 函数 期望 指针      更新时间:2023-10-16

有一个函数,我不能编辑它,它有以下声明:

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

注:注释部分是可选的…我可以擦掉它,也可以留下它。我知道这完全是不好的行为。但是,它是本机管理的包装器,所以我必须处理原始指针。

编辑:我希望数据活在作用域之外,所以得到'vec。"数据"不是一个选项。我希望它是线程安全的

您需要创建一个矢量,创建一个数组,然后从矢量复制数据:

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

如果由于某种原因数组不可触碰,函数不可触碰,则必须复制数据

表示从数组构造向量。返回后,需要将返回的数据复制回数组。

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