我一直在尝试了解Placement新概念。我在互联网上搜索了一些示例。利用所有这些信息,我自己创建了一个示例,代码如下:

#include <iostream>
#include <cstdlib>
#include <new>

using namespace std;

class MyClass
{
 private:
         size_t num;
 public:
        ~MyClass(void) { cout<<"DESTRUCTOR"<<endl; };
        void print(void) { cout<<num<<endl; };
        void set(size_t num) { this->num = num; };
};

int main(void)
{

/** Just a little test */

 MyClass* myClass = new MyClass;
 myClass->set(32);
 myClass->print();

 delete myClass;

 /***/


 //Placement new code sample.

 char* memAlloc = new char[sizeof(MyClass)];

 cout<<"memAlloc : "<<&memAlloc<<endl;

 MyClass* ptr = new(memAlloc) MyClass;

 ptr->set(95);
 ptr->print();

 cout<<"ptr : "<<ptr<<endl;

 ptr->~MyClass();
 delete[] memAlloc;

 return 0;
}


据我了解,ptr将使用由memAlloc分配的内存以及新的位置。在这种情况下,memAlloc和ptr在内存中将具有相同的地址吗?我尝试打印它(您肯定会看到),但是得到了不同的结果。在gcc 4.4.1中使用Code Blocks IDE:

memAlloc : 0x22ff04
ptr      : 0x2e1038


这可能吗?我打印的方式错误吗?

非常感谢您的任何建议。

最佳答案

您正在打印变量memAlloc的地址,而不是指针的值。

cout<<"memAlloc : "<<&memAlloc替换为cout<<"memAlloc : "<< (void*)memAlloc

10-08 11:39