对 execl() 使用 shared_ptr 数组
use shared_ptr array for execl()
我有一个 shared_ptr
到 char
的数组,像这样:
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());
我有一个 shared_ptr
到 char
的数组,像这样:
std::shared_ptr<char[]> tmp [ 10 ] ;
我已经填充了 tmp
,现在想将数据传递给 execl()
,这需要一个 char * const *
。正确的做法是什么?
I have a
shared_ptr
to an array ofchar
您拥有的是一个由 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 toexecl()
, which takes achar * 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());