C++11標準の$12.2.3は次のように述べています。
実装が重要なコンストラクター(12.1、12.8)を持つクラスの一時オブジェクトを導入する場合、その一時オブジェクトに対してコンストラクターが呼び出されるようにする必要があります。同様に、デストラクタは、重要なデストラクタ(12.4)を使用して一時的に呼び出されるものとします。一時オブジェクトは、それらが作成されたポイントを(字句的に)含む完全式(1.9)を評価する最後のステップとして破棄されます。これは、その評価が例外のスローで終了した場合でも当てはまります。一時オブジェクトを破棄することによる値の計算と副作用は、特定の部分式ではなく、完全な式にのみ関連付けられます。
(強調鉱山)
これには追加の注意事項がありますが、この状況には適用されません。あなたの場合、完全な式はこのステートメントの示された部分です:
char *szFish = AnsiString(sFish).c_str();
// ^^^^^^^^^^^^^^^^^^^^^^^^^
したがって、インスタントszFish
が割り当てられ、一時オブジェクト(つまりAnsiString(sFish)
)のデストラクタが呼び出され、その内部メモリ表現(がc_str()
指す場所)が解放されます。したがって、szFish
すぐにダングリングポインタになり、アクセスは失敗します。
あなたは言うことによってこれを回避することができます
CallFunc(AnsiString(sFish).c_str());
代わりに、ここにあるように、一時的なものは完全な式の後で(つまり、すぐに;
)破棄さCallFunc
れ、生の文字列を読み取ることができます。