我从一个守护进程启动进程,它确保所述进程连续运行并以正确的顺序启动,等等。
在某些时候,我想开始这个过程,execv()
所以我为参数准备了一个字符串数组,如下所示:
std::vector<std::string> args;
args.push_back("--debug");
args.push_back("--connect");
args.push_back("10.0.0.5:4040");
...
在大多数情况下,我有大约 10 个这样的论点。
现在,execv()
只访问一个裸指针数组。因此,我执行以下操作来创建此类指针的数组:
std::vector<char *> args_p; // sorry, my code actually uses std::vector<char const *> args_p -- so constness is fine here
for(auto a : args)
{
args_p.push_back(a.c_str());
}
args_p.push_back(nullptr); // list needs to be null terminated
然后我可以execv()
用最后一个数组调用:
execv(
args_p[0],
const_cast<char * const *>(&args_p[0])
);
这在带有 g++ 4.8.4 的 Ubuntu 14.04 中运行良好,但不知何故,c_str()
当我尝试运行使用 g++ 5.3.1 编译的相同代码时,指针会失效。
据我了解,这不应该是因为我没有修改创建裸指针数组的第一个循环和execv()
调用之间的字符串。
参考资料说:
从 c_str() 获得的指针可能会通过以下方式失效:
- 将对字符串的非常量引用传递给任何标准库函数,或
- 在字符串上调用非常量成员函数,不包括 operator[]、at()、front()、back()、begin()、rbegin()、end() 和 rend()。
PS我已经有一个修复,我现在做了一个stdup()
,c_str()
它工作得很好。如果可能的话,只有我希望避免额外的字符串副本......