放置新的和方向

时间:2010-10-18 18:35:54

标签: c++

我一直在努力了解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分配的内存和placement new。在这种情况下,memAlloc和ptr在内存中将具有相同的地址?我试图打印它(你肯定会看到)但得到不同的结果。使用代码块IDE和gcc 4.4.1:

memAlloc : 0x22ff04
ptr      : 0x2e1038

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

非常感谢任何建议。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

为什么 你想这样做吗? Placement-new绝对不是初学者的主题,它是C ++最黑暗的角落之一,并且比起初看起来要棘手得多。 (对齐任何人?)

无论如何,你的问题是,当你试图打印分配的内存时,你不打印指针引用的地址,而是打印指针所在的地址。这样做:

std::cout << "memAlloc : "<< memAlloc << std::endl; // note the missing &

但实际上,除非你有非常具体的需求(比如实施std::vector),否则很少有你需要的位置。