放置新的结果总是似乎与我提供给放置新的内存指针相同。随着GCC这似乎是正确的,即使与虚拟功能,如类...放置 - 新地址vs原始内存地址
#include <iostream>
#include <vector>
using namespace std;
class A
{
public:
int a;
virtual ~A() {}
};
int main()
{
void *mem = malloc(sizeof(A));
A* ptr = new(mem) A();
cout << "sizeof(T) = " << sizeof(A) << endl;
cout << "mem = " << mem << endl;
cout << "ptr = " << ptr << endl;
cout << "addr a = " << &(ptr->a) << endl;
ptr->~A();
free(mem);
return 0;
}
这个程序的输出是(注:64位Linux)...
sizeof(T) = 16
mem = 0x1a41010
ptr = 0x1a41010
addr a = 0x1a41018
不C++保证mem和ptr是相同的还是仅仅是GCC巧合?在一个更大的可移植程序中,我将不得不保存mem和ptr,还是可以保留其中一个,并在需要时进行投射?
为了澄清这个问题,我知道内存分配器有时会在指向内存块之前的单词中放入分配块的大小。 C++编译器是否允许使用这样的技巧,并说VMT指针在对象指针指向的内存块之前的单词中?在这种情况下,mem和ptr会有所不同。
这是一个很好的答案,但它有多权威?它是基于标准还是特定编译器的实现? – goertzenator 2012-03-11 22:25:54
@goertzenator在C++标准中定义了3个'new'操作符。我建议你是C++程序中最常用的一个。请参阅[这里](http://cplusplus.com/reference/std/new/operator%20new/)了解完整的文档和使用示例。 – 2012-03-12 17:53:59