質問
やあみんな。私は自分の仕事のために古いコードの修正に取り組んでいます。現在、C ++で書かれています。彼らは静的割り当てを動的に変換しましたが、Memsets/Memcmp/Memcpyを編集しませんでした。これは私の最初のプログラミングインターンシップなので、私のニューベーのような質問でむき出しのものです。
次のコードはCにありますが、C ++でそれを持ちたいと思っています(MallocはC ++では良い練習ではないことを読みました)。 2つのシナリオがあります。まず、Fが作成しました。次に、ゼロで埋めるために&fを使用します。 2番目はポインター *pfです。 C ++の前の例と同様に、PFをすべて0に設定する方法がわかりません。
できますか pf = new foo
mallocの代わりに電話してください 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) );
解決
はい、しかし、fooがポッドである場合にのみ。仮想関数などのリモートC ++ ishがある場合は、構造/クラスの内部全体に踏みつけるため、Memsetを使用しないでください。
Memsetの代わりにおそらくやりたいことは、Fooにそのメンバーを明示的に初期化するコンストラクターを与えることです。
新しいものを使用する場合は、対応する削除を忘れないでください。さらに良いことは、shared_ptrを使用することです:)
他のヒント
あなたはできる?はい、たぶん。あなたはすべきですか?いいえ。
おそらく機能しますが、コンストラクターがあなたのために構築した状態を失っています。これに加えて、この構造体のサブクラスを実装することにしたときにどうなりますか?次に、C ++ OOPが提供する再利用可能なコードの利点を失います。
代わりにあなたがすべきことは、あなたのためにメンバーを初期化するコンストラクターを作成することです。このようにして、この構造体を後でラインで昇華させると、このコンストラクターを使用してサブクラスの構築を支援します。これは無料で安全なコードです!これを使って!
編集:これへの警告は、すでに巨大なコードベースがある場合は、構造体のサブクラスを開始するまで変更しないでください。それは今のように機能します。
はい、それはうまくいくでしょう。しかし、私はマロックが必ずしも悪い練習であるとは思わず、それを変えるためだけにそれを変えることはありません。もちろん、割り当てメカニズムを常に適切に一致させるようにする必要があります(new-> delete、malloc-> freeなど)。
構造体にコンストラクターを追加して、それを使用してフィールドを初期化することもできます。
あなたは出来る 新しいfoo (C ++の標準的な方法です)、使用するのではなくFOOを初期化するコンストラクターを実装します メンバーセット.
例えば
struct Something
{
Something()
: m_nInt( 5 )
{
}
int m_nInt;
};
また、使用するかどうかも忘れないでください 新着 電話する 消去 オブジェクトが終了すると、メモリリークが表示されます。