はあなたのコマンドを含むstd::string
が一時オブジェクトであり、唯一の時間system
によってそう 、std::async
コールの最後まで生きるだろうが呼び出され、ポインタが動作するように起こる可能性がある、削除されたメモリを参照する、またはそれもrm -rf/--no-preserve-root
と表示される可能性があります。これは未定義の動作です。
文字列オブジェクトが十分に長く存続するようにする必要があります。あなたの例では十分に簡単ですが、非同期操作を開始する場合は必ずしもそうとは限りません。
C++ 11個のラムダ式は正確に限り、我々はそれを必要とするために私たちに良い方法ストア文字列を与える:
また
std::string command = "cp main.cpp b";
auto f1 = std::async(std::launch::async,
[command]{ // copy command into the closure
std::system(command.c_str());
}
);
、あなたはasync
起動ポリシーを要求していないことに注意してくださいので、あなたの関数は同時に同期して実行することができます。
サイドノート:外部プロセスを起動していて、出力、終了ステータスなどをキャプチャしたい場合は、POCO's Process
のようなものを使用することを検討してください。
'string(" cp a b ")。c_str()は実行時に' system'へのダングリングポインタを渡します。 – melak47
一方、文字列リテラルは存続します。 'std :: async(system、" cp a b ")' –
コードが動作するようです。おそらく、「システム」への引数が構築される方法にはいくつかの問題があります。 –