我一直在努力了解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
这可能吗?,我是以错误的方式打印的吗?
非常感谢任何建议。
答案 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
),否则很少有你需要的位置。