3

私は「手動で」動的メモリ割り当てを使用していて、MSの人が新しい配置をどのように実装するかを確認したかったのですが、デバッグ時に「ステップイン」してコードに移動しました。

inline void *__CRTDECL operator new(size_t, void *_Where) _THROW0()
{   // construct array with placement at _Where
return (_Where);
}

このコードで見ることができるのは、引数として指定したものを含むreturnステートメントの行だけである場合に、このコードがオブジェクトをポインターが指す場所に配置する方法を誰かに説明してもらえますか?コメントでこのfncに何をしてほしいかを言うだけでは、実際には十分ではないと思います。建設的な回答ありがとうございます。

4

2 に答える 2

14

の目的はoperator new、オブジェクトにメモリを割り当て、そのメモリへのポインタを返すことだけです。new配置を使用すると、基本的にコンパイラに「このメモリが適切であることがわかっているので、割り当てをスキップして、このポインタをオブジェクトに使用する」と伝えています。次に、オブジェクトのコンストラクターは、operator new割り当てられたばかりのメモリーであるかどうか、または配置newを使用して指定されたメモリーであるかどうかによって提供されるポインターを使用して呼び出されます。operator newそれ自体は、オブジェクトがどのように構築されるかには関係ありません。

于 2009-11-13T20:56:48.737 に答える
5

new T(...)(「新しい式」と呼ばれる)が行うことは、メモリの割り当てとオブジェクトの初期化の2つであることに注意してください。コンストラクターを作成することにより、初期化を微調整できます。あなたが書く割り当てのためにoperator new。そのため、名前にもかかわらず、operator new新しい式が行うことの片側だけを行います。

新しい配置は、オブジェクトを事前に割り当てられたメモリに配置するためのものです。this事前に割り当てられたメモリをポインタとして直接渡すコンストラクタを呼び出すことはできません。実行できる唯一のことは、配置を新しく使用することです。これにより、割り当てがノーオペレーションに変わり、構築のみが残ります。これ

inline void* operator new(size_t, void *p) throw()
{
  return p;
}

そのno-opの実装にすぎません。

于 2009-11-13T23:13:59.170 に答える