Effective C++条項17

1027 ワード

独立した文でnewedオブジェクトをスマートポインタに配置
このセクションで学習する必要がある知識の核心は、コンパイラが同じ文で呼び出し順序に不確実性があり、異なる文で呼び出し順序が決定されることに注意することです.上の話はどういう意味ですか.次のコードを参照してください.
int priority();
int processWidget(shared_ptr<Widget> pw, int priority);
processWidget(shared_prt<Widget> pw(new Widget), priority());

以上のコードは、1、priority()関数2の実行、new Widget 3の実行、shared_の実行の3つの動作を実行します.ptrコンストラクション関数皆さんはこの3つの動作順序を知っていますか?コンパイラが実行するとき、以上の3つの行為に対する実行順序が不確定であり、唯一確定した順序は2行為が3行為の後にあるからだと思います.
実行順が2、1、3の場合.では、関数priority()呼び出しに異常が発生した場合、new Widgetが返すポインタはshared_を入れる時間がありません.ptrで.これにより、メモリが漏洩します.
したがって,プログラミングの際には,緊密な動作を単独で単一の文として記述したほうがよい.次のようになります.
shared_prt<Widget> pw(new Widget);
processWidget(pw,priority());