1

こんにちは私は新しい配置で運動していて、それを使ってオブジェクトを作成しています。次のことを考慮してください。

class PNewTesting
{
private:
    string words;

public:
    PNewTesting(const string & w = "Placement new testing");
};

PNewTesting::PNewTesting(const string & w)
{
    words = w;
    cout << words << " constructed" << endl;
}


int main()
{
    char * buffer = new char[BUF];

    PNewTesting *p1,*p2;

    p1 = new (buffer)PNewTesting;

    p2 = new PNewTesting("Placing object in heap");

    cout << "Memory addresses: " << endl;
    cout << "buffer: " << (void *)buffer << endl;
    cout << "object placed in buffer: " << p1 << endl;
    cout << "object in heap: " << p2 << endl;
}

その部分は私を混乱させています、私が書くときcout << "buffer: " << &buffer << endl;、これは私に書くときとは異なるアドレスを与えるだろうということですcout << "buffer: " << (void *)buffer << endl;

&buffer問題は、との違いは何ですか(void*)buffer、そしてなぜそれらのそれぞれが私に異なるアドレスを与えるのかということです。

4

4 に答える 4

3

あなたの質問は本質的に次のように減らすことができます:

#include<iostream>

int main()
{
    int i = 10;
    int *ptr = &i;

    std::cout<<(void*)ptr<<"\n";
    std::cout<<(void*)&i<<"\n";
    std::cout<< &ptr<<"\n";
}

出力:

0xbfa080b8
0xbfa080b8
0xbfa080bc

ptrポインタが指しているオブジェクトのアドレスを示します。つまり、と同じ&iです。
&ptrポインタ自体が格納されている場所のアドレスを示します。

于 2013-02-11T14:30:21.143 に答える
1

1つは変数のアドレスを表示し、もう1つは変数の値を表示します。これらを考慮してください:

int i = 7;
std::cout << &i << "\n";
std::cout << i << "\n";

前者は、呼び出された変数のアドレスを表示しますi(おそらく大きな偶数)。もう1つは、その値(7)を表示します。

同様に:

char *buffer;
std::cout << &buffer << "\n";
std::cout << (void*)buffer << "\n";

前者はのアドレスを表示しますbuffer。後者はキャスト値を表示します。

于 2013-02-11T14:30:04.970 に答える
1

違いは簡単です。bufferはcharへのポインタ(void*)bufferであり、割り当てられた文字配列のメモリ内の場所も同様です(voidポインタとして)。&buffer一方、は、buffer それ自体のメモリ内の場所です。

図が役立つ場合があります。これは何が起こっているかを象徴するものであり、実際のメモリレイアウトがどのようになるかを表すものではありません。

Memory
AB AB AB AB 00 00 00 08  <-- buffer = 00 00 00 08; the characters are stored starting at 0x08
             ^
             |---------     &buffer is the memory location of buffer, and is 0x04
30 31 32 32 AB AB AB AB
^
|-------- char array starts at 0x08, and contains the string "1234"
于 2013-02-11T14:30:42.320 に答える
1

式は、スタックのどこかにある&bufferのアドレスを提供します。buffer

エクスプレッション(void *)bufferは、バッファに含まれるアドレスをvoidポインタとして提供します(この場合、はcout、値を文字列として出力しようとするのではなく、ポインタを表す16進数として値を出力することを意味します。これは、コードが通常.で行うことchar *です。

于 2013-02-11T14:29:55.220 に答える