もう 1 つの非常に重要な違いは、例外の安全性です。あなたのコードで:
int iCount = 5;
int i = 0;
while(i < iCount)
{
f = new foo();
i++;
}
これでメモリリークが発生しないように、非常に注意する必要があります。foo
例外が発生した場合にこれを適切にクリーンアップできるようにするには、すべてを覚えておく必要があります。このコードがコンストラクタ内にある場合、デストラクタで割り当てを解除するだけでは十分ではありません。例外がスローされると、オブジェクトが生き返らず、デストラクタが呼び出されないためです。これは、正しいコピー構築とコピー代入、各例外セーフなどの書き込みにさらに伝播します。
vector
教訓: 、list
、またはdeque
(他にもあります) などの標準的なコンテナーを使用します。
//////////////////
foo* f = new foo[iCount];
foo
first と last の割り当ての間に例外がスローされた場合、これは少なくとも構築されたそれぞれを破壊しfoo
ます。
もちろんf
、特にこの割り当てを行うコードに他のスローポイントがある場合は、適切に削除されるように注意する必要があります。
教訓: 標準的なコンテナを使用してください。特に C 言語を使用している場合、手動のメモリ管理は一見簡単に思えるかもしれませんが、例外セーフ コードを記述することは重要であり、重要です。