1

嗨,我一直在练习放置 new 并使用它来创建对象。考虑以下:

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

该表达式&buffer将为您提供 的地址buffer,该地址位于您的堆栈中的某个位置。

表达式(void *)buffer将为您提供缓冲区中包含的地址,作为 void 指针(在这种情况下,这意味着cout将值打印为表示指针的十六进制数,而不是尝试例如将值打印为字符串,这将是代码通常对char *.

于 2013-02-11T14:29:55.220 回答
1

其中一个显示变量的地址,另一个显示变量的值。考虑这些:

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

前者显示被调用变量的地址i(可能是一个大的偶数)。另一个显示其值 (7)。

相似地:

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

前者显示 的地址buffer。后者显示其施法值。

于 2013-02-11T14:30:04.970 回答
1

区别很简单。buffer是指向字符的指针,因此(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 回答