0

オブジェクトの割り当てに使用されたメモリを解放できますか? もしそうなら、どうすればいいですか?

class CRectangle {
    int width, height;
public:
    CRectangle (int,int);
    ~CRectangle ();
    int area () {
        return (width * height);
    }
};

CRectangle::CRectangle (int a, int b) {
    width = a;
    height = b;
}

CRectangle::~CRectangle () {
    // Do something here
}

動的メモリ割り当てを使用した場合、次のようになります。

   class CRectangle {
        int *width, *height;
    public:
        CRectangle (int,int);
        ~CRectangle ();
        int area () {
            return (*width * *height);
        }
    };

    CRectangle::CRectangle (int a, int b) {
        width = new int;
        height = new int;
        *width = a;
        *height = b;

    }

    CRectangle::~CRectangle () {
        delete width
        delete height
    }

それらは同じ出力を持っているので、動的メモリ割り当てを使用する利点は何ですか?

4

3 に答える 3

1

あなたの特定の例では、どちらも技術的に正しく、デストラクタでこれ以上何もする必要はありません。

2 番目の例では、まったくメリットがありません。メモリの割り当てにオーバーヘッドがあるため、実際にはメモリを浪費しています。このようなオーバーヘッドの最小値は 12 バイト + 割り当て自体です。この場合、4 バイトと仮定すると合計 16 バイトになりintます (これは一般的ですが、代替手段があります)。

オブジェクトのサイズが異なる場合 (あなたのものは常に 1 のサイズint) [そして最大サイズがメモリ自体の割り当ての予想されるオーバーヘッドよりも大きい] またはオブジェクトのオプションである [そして予想されるオーバーヘッドよりも大きい]場合、オブジェクトの割り当ては有益です。オブジェクトの割り当て]。

たとえば、サイズの単位ごとにオブジェクト (たとえば、ある種のゲームの各セルの内容など) をCRectangle保持することを想像してください。CCellここで、四角形の各辺が 1 x 1 から数千の任意のサイズになると想像すると、各次元で数千の静的な 2 次元配列を作成したくないでしょう。したがって、動的に割り当てる必要があります。この説明のために、width * height必要なサイズの の大きな配列を割り当てるだけです。2D 割り当てを行うことを検討することもできますが、それはコードをより複雑にします。

これは次のようになります。

class CRectangle {
    int width, height;
    CCell* cellArray;
public:
    CRectangle (int,int);
    ~CRectangle ();
    int area () {
        return (width * height);
    }
};

CRectangle::CRectangle (int a, int b) {
    width = a;
    height = b;
    cellArray = new CCell[width * height];
}

CRectangle::~CRectangle () {
    delete [] cellArray;
}
于 2013-05-16T06:23:13.527 に答える
0

設計するクラスでは、デストラクタで何もする必要はありません。

これで結構です:

CRectangle::~CRectangle () {
}
于 2013-05-16T05:19:33.303 に答える