1

このコードは安全ですか?

int main() {

    struct {
        int foo;
        int bar;
        std::list<...>::iterator it;
    } foobar;

    memset(&foobar, 0, sizeof(foobar));

    foobar.it = ...;
}

std::iteratorオーバーライドしていないようですので安全だと思いますoperator=。これは有効な理由ですか?

4

3 に答える 3

7

いいえ。代入演算子は通常、その左側(受信者)のオペランドが代入前に有効な状態にあると想定します。

その間、あなたはこれらのゼロを、おそらく自明ではないstd::list<...>::iteratorタイプのオブジェクト上でスチームローリングしています。これは、の正確なプロパティについての深い知識がありstd::list<...>::iterator、ゼロで埋めると有効なオブジェクトが生成されることを知っている場合にのみ機能します。

于 2012-11-17T02:31:15.570 に答える
6

memset()自明でないタイプを使用することは悪い考えです。まったく不要です。値を初期化するだけです。

struct {
    int foo;
    int bar;
    std::list<...>::iterator it;
} foobar = {};

それはより速くそしてまた正しいことをするという明確な利点を持っています!

于 2012-11-17T02:31:33.610 に答える
2

コンストラクターを持つ型をmemsetしないでください。イテレータの内部構造がわからないので、ハンマーで叩いてはいけません。

于 2012-11-17T02:32:12.517 に答える