その場で注釈を付けて回答させてください。
クラスキャット()
{
公衆:
ネコ()
{
= 0; // ok: 変数 a が存在する場所に設定します
(*b) = 0; // ダメ: 整数 0 を b が指している場所に格納します
// b は何にも初期化されていないため、書き込み可能
// どこでも想像できます。運が良ければ、コンパイラ
// ポインターを暗黙的にゼロに初期化します。
// 少なくとも確定的なセグメンテーション違反を取得します。
}
int a; // Cat が構築される場所ならどこにでも存在する整数変数
int* b; // Cat が構築される場所ならどこにでも存在するポインタ変数
// (b = 何か) に設定される場所は、ヒープ、スタック、
// マップされたメモリ、制御不能 (ここのように)
};
int main(int argc, char* argv[])
{
猫 cat1; // cat1 をスタックに割り当て、すべての属性 (a と b) を有効にします
// そこの。cat1.b が指す場所は無制限です。
Cat* cat2 = new Cat(); // Cat クラスのオブジェクトをヒープに割り当て、
// ポインタ変数 cat2 をスタックに割り当て、
// ヒープに割り当てられた Cat へのポインタ
// 繰り返しますが、cat2.b が指す場所は無制限です。
0 を返します。// segfault が原因で到達できなかった可能性があります ;-)
}
タイトルでメモリ管理について言及しているように、スタック変数はスコープ外になると自動的に破棄されます。cat1
つまり、 and (1 つの Cat と 1 つのポインター)によって占有されていたスペースは、cat2
main() を終了するときに回復されます。また、cat1 の場合、デストラクタが呼び出されます。あなたの場合、明示的なデストラクタはありませんが、Cat にデストラクタを持つ属性がある場合、自動デストラクタが自動生成されます。
ポインターの場合、ポインターが破棄されても、指しているオブジェクトは自動的に破棄されません。それが必要な場合は、std::auto_ptr<> (または Qt の QScopedPoiner) のようなスマート ポインターを確認する必要があります。これは、ポイント先のオブジェクトを実際に破棄する (delete を呼び出すことによって) ポインターのようなオブジェクトを提供します。 auto_ptr が破壊されたとき。
スマート ポインターを使用しない場合は、delete 演算子を使用して、ポイント先のオブジェクトを手動で破棄するように注意する必要があります。現在のスコープからのすべてのリターンパスでそれを行うように注意してください(複数のリターン、スローされた例外など)。