私はそう私は、文字列の配列を作成し、私はexecv()
でプロセスを開始するいくつかの時点でg ++ 4.8.4とg ++ 5.3.1の間でc_str()のライフタイムが変更されましたか?
など、プロセスが継続的に実行し、適切な順序で始めると述べたことを確認するデーモンからプロセスを起動しますそのような引数:
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])
);
グラムでのUbuntu 14.04で完全に働いていた++ 4.8.4、何らかの形で、g ++ 5.3.1でコンパイルされた同じコードを実行しようとすると、c_str()
ポインタが無効になります。
裸のポインタの配列を作成する最初のループとexecv()
呼び出しの間の文字列を変更しないので、私が理解している通りです。
referenceは言う:
- 任意の標準ライブラリ関数に文字列への非const参照を渡す、または :
- operator []、at()、front()、back()、begin()、rbegin()、end()およびrend()を除く、文字列上の非constメンバー関数の呼び出し。
c_strから得られたポインタが()によって無効にされてもよいです
P.S.私はすでに修正をしていますが、今はのうちstdup()
を実行しています。 char const*
を返し、args_p
がvector<char*>
あるc_str()
for(auto a : args)
{
args_p.push_back(a.c_str());
}
まず、:私だけは、可能ならば...ここ
それは働いたことはありません。それはちょうどに現われた。あなたは未定義の振る舞いをしている – juanchopanza
'auto&a:args' –
@ T.C。ああ、それは 'auto const&a:args'でなければなりません。 –