1

これら2つのコードの違いはどれですか?最初のケースでメモリリークはありますか?

デストラクタが定義されていません

 class Library
{
private:
    Book books[50];
    int index;
public:
    Library()
    {

        index=0;
    }
};

またはデストラクタが定義されている

class Library
{
private:
    Book *books;
    int index;
public:
    Library()
    {
        books=new Book[50];
        index=0;
    }
    ~Library()
    {
        delete books;
    }
};
4

3 に答える 3

3
delete books;

する必要があります

delete[] books;

2 つ目:booksは配列として割り当てられているため、配列として削除する必要があります。最初のバージョンにはメモリ リークはありません。

違いは、最初のケースでは のメモリがbooksの各インスタンスの割り当て内に含まれているのに対しLibrary、2 番目のケースではヒープを使用して個別に割り当てられることです。

于 2012-11-07T20:53:59.433 に答える
1

まず、2番目のコードは

~Library() {
  delete[] books;
}

newと一致する必要がありdelete、と一致するnew[]必要がありますdelete[]

最初のコードでは、のすべてのインスタンスLibraryに。の50個のインスタンスが含まれていますBook。aLibraryをコピーすると、それらの50個のインスタンスがコピーされます。メモリリークはありません。

2番目のコードでは、のインスタンスにLibraryは本へのポインターのみが含まれています。インスタンスをコピーすると(デフォルトのコピーコンストラクタなしで)、ポインタだけがコピーされます。元のコピーとコピーは50冊の本を共有し、2番目に破壊された人はdelete、すでに削除されたメモリで発行されます。これはエラーです。

于 2012-11-07T20:56:18.260 に答える
1
~Library()
{
    delete[] books;
}

適切な解決策です。コードには自由に考えられる問題があり、次のように考えることができます。

1) 初期化リストを使用する

2 番目のケース:

2) 本当にポインターを実行する必要がありますか? ローカルオブジェクトでは十分ではありませんか?(あなたの本はスタックサイズを超えていないと思います)。作成しているコードを最初に見て、最後に削除してください。スタックはより高速で安全であることを忘れないでください。

また、本当に優れたツールである valgrind にも精通してください。cppcheck が役立つかどうかを確認してください。ubuntuの「sudo apt-get install cppcheck」。

于 2012-11-07T21:01:24.710 に答える