1

memoryCounterクラスによって引き起こされたメモリ リークをキャッチしようとするというクラスがあるとしMyClassます。

class memoryCounter
{
public:
    static int MyClassCount;
};
int memoryCounter::MyClassCount = 0;

また、次の行をコンストラクタとデストラクタ(およびコンストラクタ/デストラクタ以外MyClassの場所を変更しないと仮定して、それが持つ他のコンストラクタ) に配置するとします。MyClassCount

MyClass()
{
    memoryCounter::MyClassCount++;
}
virtual ~MyClass()
{
    memoryCounter::MyClassCount--;
}

さて、含まれているものがゼロの場合、これまでに割り当てたすべてのメモリが解放され、リークがないことを完全に確信できますか? memoryCounter::MyClassCountまたは、変数にゼロが含まれているが、解放されていないメモリが割り当てられているという状況が発生する可能性があります (「MyClass」が基本クラスまたは派生クラスである状況も考慮してください)。

4

4 に答える 4

3

いいえ、できません。他のコンストラクターも存在する可能性があります (少なくともコピー コンストラクター)。あなたはそれらを数えません。

また、変数は終了static後に破棄されるため、変数の破棄を簡単に数えることはできません。main

于 2012-08-01T10:40:25.177 に答える
2

カウントがゼロの場合、 のインスタンスはありませんMyClassMyClassオブジェクトが完全なオブジェクトであるか、基本クラスのサブオブジェクトであるか、さらに言えばメンバーのサブオブジェクトであるかに関係なく適用されます。それ自体がメモリ リークを起こしている可能性があるため、必ずしもメモリ リークがないことを意味するわけではありませんMyClass

注意すべきことは、デフォルトで生成されるコピー コンストラクターです。「それが持っている他のコンストラクター」がグローバルカウントをインクリメントすると仮定すると言いますが、コードに表示されないコンストラクターを見逃すのは簡単です。ここで 3 つのルールを適用できます。つまり、デストラクタを定義するので、コピー コンストラクタを定義する必要があります。このルールでは、コピー代入演算子を定義することも指示されていますが、この場合は必要ありません。

于 2012-08-01T11:05:05.473 に答える
1

コンストラクターだけがメモリを割り当てると誰が言いますか? 非コンストラクター メンバー関数 (静的かどうかに関係なく) がメモリを割り当て、デストラクタが適切にクリーンアップしない場合、そのメモリ リークが発生しています。

したがって、答えはノーです。標準コンストラクターを介して作成されたクラス インスタンスを数えました。それ以上でもそれ以下でもありません。

于 2012-08-01T11:09:05.540 に答える
0

MyClass (およびそれから派生したもの) が正しく記述されていると想定しています。特に、次のリークは検出されません。

class BadClass : private MyClass
{
  public:
     BadClass() { int *x = new int(5); }
}

カウンターは、構築ごとに 1 つの破壊が行われたことを示します。これは、誰も「MyClass」オブジェクトをリークしていないことを意味します。

しかし、それはメモリ リークがないことと同じではありません。

于 2012-08-01T11:53:53.220 に答える