ホームページ >バックエンド開発 >C++ >配列に New を配置すると、C での移植性が保証されますか?

配列に New を配置すると、C での移植性が保証されますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-12 16:48:02454ブラウズ

Does Placement New on Arrays Guarantee Portability in C  ?

配列の New の配置は移植性を確保できますか?

New の配置は C で配列を初期化する手段を提供しますが、配列に使用すると潜在的な可能性が生じます。移植性の問題。具体的には、new[] から取得されたポインタが指定されたアドレスから逸脱し、配列へのバッファ割り当てが妨げられる可能性があります。

標準の 5.3.4、注 12 ではこの矛盾を認めており、配列に適切なサイズ。例では問題を強調しています。

この例では、コンパイラーは配列要素の数をバッファーの最初の 4 バイトに格納しているようです。その結果、バッファには sizeof(A) * NUMELEMENTS バイトの領域のみが割り当てられるため、メモリ破損が発生します。

移植性に関する懸念の回避:

これらの移植性を軽減するにはこの問題については、次のアプローチを検討してください。

  • Manual Placement New: 配列に対して Placement New を使用するのではなく、配列の各要素を個別に初期化するために使用します。例:
  • 手動破棄: メモリ リークを防ぐために、バッファを削除する前に各配列要素を手動で破棄します。

new[] を配置するための追加のオーバーヘッドは、実装とクラス定義によって異なる可能性があることに注意することが重要です。それにもかかわらず、この手動アプローチにより、さまざまなコンパイラー間での移植性が確保され、オーバーヘッドを動的に確認する必要がなくなります。

以上が配列に New を配置すると、C での移植性が保証されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。