0

私はゲームを書いていて、前の小屋で、メモリが残っていないために5分間使用するとクラッシュするビデオデコーダーに取り組んでいたことを覚えています。

上司は一日中それを修正しようとして、翌日少し腹を立てて私に会いに戻ってきました。コンストラクターの初期化子リストにすべてのクラスメンバー属性を入れなかったと言ったからです。

それはintまたは多分他のデータ/プリミティブでした。今では、クラス内のものは、アドレスに残っているものの影響を受けるのではなく、デフォルト値で初期化されていると思いました。私は今まで同じことをしているので、この質問をすることを本当に考えたことはなかったので、これを明確にしたいと思いました。

私がやるとしましょう:

#pragma once
#include "GameState.h"
#include "GameGrid.h"

class Shape;

class PlayState : public GameState
{

....

private:
sf::Clock _keyPressClock;

Shape *_droppingShape;
int generateShapeID();
int generateHorizSpawnPos();
};

私のコンストラクターがすべて初期化する場合は、ポインターです:

PlayState::PlayState() : _droppingShape(NULL) {}

それは悪い習慣ですか、それとも実際にメモリリークを引き起こす可能性がありますか?

4

3 に答える 3

2

良い練習?はい、特に。ポインタの場合、NULL/nullptrがポインタがオブジェクトを指していないことを知る唯一の方法であるため。

メモリーリーク?いいえ、割り当てなし=>リークなし。

于 2013-02-22T05:36:34.687 に答える
1

今では、クラス内のものは、アドレスに残っているものの影響を受けるのではなく、デフォルト値で初期化されていると思いました。

オブジェクトのコンストラクターが実行されるときにメンバー変数が構築されるという意味で、これは部分的に真実です。ただし、基本型(int、ポインターなど)にはコンストラクターがないため、特に何かで初期化されることに依存することはできません(これも参照してください)。

これらのタイプをイニシャライザーリストで初期化することは一般的に良い習慣と考えられていますが、使用を開始する前に他の場所で初期化する場合は、必ずしも必要ではありません。

delete最初にメモリを割り当てない限り、メモリリークは発生しませんが、で初期化されていないためにランダムな値を持つポインタを使用すると、間違いなくエラーが発生します(サイレントの場合もあります)nullptr

于 2013-02-22T05:48:39.647 に答える
0

IIRC、初期化子リストで明示的に初期化されていない場合、メンバー変数は「デフォルトコンストラクター」で初期化されます。後でメンバー変数の値をコンストラクター本体の値に割り当てることができますが、これは効率が低下します。

newメモリリークに関しては、またはでメモリを割り当てた場合にのみ発生する可能性がありますnew[]。これらを使用しない限り、メモリリークは発生しません。ただし、ポインタを使用している場合、この割り当ては、内に隠されていても、どこかで発生しますauto_ptr

于 2013-02-22T05:41:24.927 に答える