为execl()使用shared_ptr数组

时间:2017-06-06 11:26:10

标签: c++ shared-ptr

我有shared_ptr数组char,如下所示:

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

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

1 个答案:

答案 0 :(得分:0)

  

我有一个shared_ptr

数组char

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

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

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

我填充了tmp,现在想要将数据传递给execl(),这需要char * const *

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

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

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

  

这样做的正确方法是什么?

std::shared_ptr<char[]>::get()方法将返回char*,可以将其传递给const char*参数。

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

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