4

ブロック割り当てと個々のオブジェクト割り当ての主な違いは何ですか。言わせて

int iCount = 5;

int i = 0;
while(i < iCount)
{
  f = new foo();
 i++;
}

//////////////////
foo* f = new foo[iCount];

その2番目の方法は、メモリスペースを節約できますか?. 割り当てたすべてのオブジェクトが 16 の管理バイトに囲まれていると聞きました。そのため、ブロック割り当ては 1 つのヘッダー ガードのみを使用します。それは本当ですか?

4

2 に答える 2

1

もう 1 つの非常に重要な違いは、例外の安全性です。あなたのコードで:

int iCount = 5;
int i = 0;
while(i < iCount)
{
    f = new foo();
    i++;
}

これでメモリリークが発生しないように、非常に注意する必要があります。foo例外が発生した場合にこれを適切にクリーンアップできるようにするには、すべてを覚えておく必要があります。このコードがコンストラクタ内にある場合、デストラクタで割り当てを解除するだけでは十分ではありません。例外がスローされると、オブジェクトが生き返らず、デストラクタが呼び出されないためです。これは、正しいコピー構築とコピー代入、各例外セーフなどの書き込みにさらに伝播します。

vector教訓: 、list、またはdeque(他にもあります) などの標準的なコンテナーを使用します。

//////////////////
foo* f = new foo[iCount];

foofirst と last の割り当ての間に例外がスローされた場合、これは少なくとも構築されたそれぞれを破壊しfooます。

もちろんf、特にこの割り当てを行うコードに他のスローポイントがある場合は、適切に削除されるように注意する必要があります。

教訓: 標準的なコンテナを使用してください。特に C 言語を使用している場合、手動のメモリ管理は一見簡単に思えるかもしれませんが、例外セーフ コードを記述することは重要であり、重要です。

于 2012-04-17T08:06:01.070 に答える