2012-01-18 8 views
1
class X 
{ 
public: 
    X (int); 
    // ... 
}; 

私たちは余分な引数でアロケータ機能を提供し、新しいを使用している場合、このような追加の引数を供給することにより、任意の場所にオブジェクトを配置することができます配置(TC++ PL第3版の10.4.11を参照)

void* operator new(size_t, void *p)  
{ 
    return p; 
} // explicit placement operator 

void* buf = reinterpret_cast<void*>(0xF00F); // significant address  
X*p2 = new(buf)X; //construct an X at ‘buf;’ invokes: operator new(sizeof(X),buf) 

どういう意味ですか? reinterpret_castとは何ですか?ここで何をしていますか? 説明する。

+1

'0xF00o0F'、eh? o_0 –

+2

Googleはずっとですか? – Lou

+1

これを間違った方法でやってはいけませんが、SOユーザーに "The C++ Programming Language、3rd Edition"のすべての部分を説明するように頼むことはまずありません。 **大きな**本です。そしてそれはかなり良いものです。問題の章を読んで、もう一度読むと、私はあなたの答えを見つけることができると確信しています。 –

答えて

2

operator newに電話をかける方法は2つあります。

X *p1 = new X; 

この使用法を使用すると、2つのことを行うようにコンパイラに言っている:

  1. はXのインスタンスを格納するのに十分なスペースを割り当て、私はあなたが精通していると仮定している最初の方法operator newに何か異なることをグローバルにオーバーロードしない限り、これは標準ランタイムによって提供されるデフォルトのアロケータを呼び出すことによって行われます。
  2. Xのデータメンバーを記入し、Xのコンストラクタの1つを呼び出して、既知の初期状態に戻します。あなたは基本的にがbufで提供するスペースを使用する代わりに、X用のスペースを割り当てていないコンパイラを言っている。この用法では

    X*p2 = new(buf) X; 
    

    :あなたのコードで提示operator newの今、第二の形式

このXのインスタンスを構築します。ステップ2はまだ実行されますが、ステップ1はスキップされます。

reinterpret_cast<void *>は、アドレス0xF00Fにあるものを本質的にコンパイラーに伝えています。これを一般的なデータとして扱います。タイプまたはサイズはこのデータに関連付けられていません。これは、生のCスタイルのキャストを行うことに相当します。

void* buf = (void*)0xF00F; 

これは、オペレータ新しいの関数のシグネチャを満たすために行われます

void* operator new(size_t, void *p) 

注意を汎用ポインタvoid *p - 渡されたbufにの値になりますより早くキャストは彼らの 'タイプ'マッチを作るためにそこにあります。また、0xF00Fは技術的には有効なアドレスではありませんが、この例の場合はふりをします。

これは、上記のコードが実行していることであり、広く説明されています。

+0

t-ありがとう.. –

関連する問題