对 execl() 使用 shared_ptr 数组

use shared_ptr array for execl()

我有一个 shared_ptrchar 的数组,像这样:

std::shared_ptr<char[]> tmp [ 10 ] ;

我已经填充了 tmp,现在想将数据传递给 execl(),这需要一个 char * const *。正确的做法是什么?

I have a shared_ptr to an array of char

您拥有的是一个由 10 个默认构造的 std::shared_ptr 对象组成的静态数组。那是你真正想要的吗?

或者您是否需要一个包含指向单个数组的指针的 std::shared_ptr 对象?

std::shared_ptr<char[]> tmp(new char[10]);

I have populated tmp, and now want to pass the data to execl(), which takes a char * const *.

不,不是。它需要 2+ const char* 个参数。仔细看声明:

int execl(const char *path, const char *arg, ...);

const char*char * const * 之间存在 差异。

What's the right way to do it?

std::shared_ptr<char[]>::get()方法会return一个char*,可以传递给一个const char*参数。


Update:如果您尝试将 10 个单独的 char[] 数组传递给 execl(),每个参数一个,那么您的静态数组就可以了。只需为要传递给 execl():

的每个参数调用 tmp[index].get()
std::shared_ptr<char[]> tmp[10];
// populate tmp, then ...
execl(file, tmp[0].get(), tmp[1].get(), ..., tmp[9].get());

或者,使用 execv() 代替:

std::shared_ptr<char[]> tmp[10];
// populate tmp, then ...

char* args[11];
for (int i = 0; i < 10; ++i)
    args[i] = tmp[i].get();
args[10] = nullptr;

execv(file, args);

如果您事先不知道参数的数量,这将特别有用:

std::vector<std::shared_ptr<char[]>> tmp;
// populate tmp, then ...

std::vector<char*> args;
for (auto &p : tmp)
    args.push_back(p.get());
args.push_back(nullptr);

execv(file, args.data());