7

私は自分の仕事のために古いコードを修正することに取り組んでいます。現在、C++で記述されています。彼らは静的割り当てを動的に変換しましたが、memsets / memcmp/memcpyを編集しませんでした。これは私の最初のプログラミングインターンシップであり、私の初心者のような質問にはほとんど触れていません。

次のコードはCですが、C ++で使用したいと思います(mallocはC ++では適切ではないことを読みました)。2つのシナリオがあります。最初に、fを作成しました。次に、ゼロで埋めるために&fを使用します。2番目はポインタ*pfです。C ++の前の例のように、pfをすべて0に設定する方法がわかりません。

pf = new foomallocの代わりに実行してから、電話をかけてもらえますmemset(pf, 0, sizeof(foo))か?

struct foo { ... } f;
memset( &f, 0, sizeof(f) );

//or

struct foo { ... } *pf;
pf = (struct foo*) malloc( sizeof(*pf) );
memset( pf, 0, sizeof(*pf) );
4

4 に答える 4

8

はい。ただし、fooがPODの場合に限ります。仮想関数やその他のリモートC++のようなものがある場合は、構造体/クラスの内部全体を踏みにじるので、memsetを使用しないでください。

memsetの代わりにおそらくやりたいことは、fooにそのメンバーを明示的に初期化するコンストラクターを与えることです。

newを使用する場合は、対応する削除を忘れないでください。さらに良いのはshared_ptrを使用することです:)

于 2010-05-05T14:15:11.127 に答える
4

あなたはできる?はい、たぶん。あなたはすべきですか?いいえ。

おそらく機能しますが、コンストラクターが作成した状態を失っています。これに加えて、この構造体のサブクラスを実装することにした場合はどうなりますか?そうすると、C++OOPが提供する再利用可能なコードの利点が失われます。

代わりに、メンバーを初期化するコンストラクターを作成する必要があります。このように、後でこの構造体をサブレーザー化するときは、このコンストラクターを使用してサブクラスの構築を支援します。これは無料で安全なコードです!これを使って!

編集:これに対する注意点は、すでに巨大なコードベースがある場合は、構造体のサブクラス化を開始するまで変更しないでください。現在のように動作します。

于 2010-05-05T14:14:23.583 に答える
2

はい、それはうまくいくでしょう。ただし、mallocは必ずしも悪い習慣ではないと思います。また、変更するためだけに変更することはありません。もちろん、割り当てメカニズムを常に適切に一致させる必要があります(new-> delete、malloc-> freeなど)。

構造体にコンストラクターを追加し、それを使用してフィールドを初期化することもできます。

于 2010-05-05T14:12:00.457 に答える
2

(C ++の標準的な方法であるように)fooを新しくし、 memsetを使用する代わりにfooを初期化するコンストラクターを実装することができます。

例えば

struct Something
{
    Something()
        : m_nInt( 5 )
    {

    }

    int m_nInt;
};

また、オブジェクトの処理が終了したときにnewを使用してdeleteを呼び出す場合は、忘れないでください。そうしないと、メモリリークが発生します。

于 2010-05-05T14:18:22.637 に答える