Placement New は、特定のメモリ位置にあるオブジェクトにメモリを割り当てる方法を提供します。配列での使用は簡単そうに見えますが、移植性を実現するには課題が生じる可能性があります。
問題
次の例を考えてみましょう。
char *pBuffer = new char[NUMELEMENTS*sizeof(A)]; A *pA = new(pBuffer) A[NUMELEMENTS];
ここでは、 pBuffer には、new[] によって割り当てられた配列のバッファが含まれます。ただし、 new(pBuffer) A[NUMELEMENTS] は pBuffer と同じアドレスを返さない可能性があり、メモリ破損につながる可能性があります。
問題への対処
1 つのアプローチは次のとおりです。配置 new:
for(int i = 0; i < NUMELEMENTS; ++i) { pA[i] = new (pA + i) A(); }
を使用して、各配列要素を個別に手動で配置します。これにより、各要素がバッファ内の正しい位置に割り当てられるようになります。
デストラクターの処理
配列を削除する場合、バッファを削除する前に各要素のデストラクターを手動で呼び出すことが重要です。
for(int i = 0; i < NUMELEMENTS; ++i) { pA[i].~A(); } delete[] pBuffer;
このアプローチにより、適切なオブジェクトのクリーンアップとメモリの割り当て解除が保証されます。
結論
配列に新しい配置を行うと、割り当てられたアドレスと返されたアドレスの間で不整合が生じる可能性があるため、移植性に課題が生じます。各配列要素を手動で配置し、デストラクターを処理することで、開発者はこれらの課題を克服し、移植可能なコードで新しい配置を安全に活用できます。
以上が移植可能なコードの配列に対して Placement New を安全に使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。