分类: C/C++
2008-05-31 08:25:37
#include
#include
using namespace std;
struct chaff{
char a[20];
int flag;
};
char buffer1[50];
char buffer2[500];
int main(){ chaff *p0,*p1,*p2; p0=new chaff; p1=new (buffer1) chaff; p2=new (buffer1) chaff; return 0; 当然,你可能会觉得程序有点奇怪。p1和p2都使用了以buffer1为首地址的内存。这样p2会不会将p1覆盖?另外使用placement new操作符的地方没有用delete语句释放内存。这样会不会出问题。答案是:不会。事实上,placement new操作符使用的是静态内存,而不是动态分配的内存。这就意味着,不能用delete操作符来对它进行内存释放。这就跟这样写一样: cout<<\"p2->a = \"< 查看这时的输出,你会发现,p1和p2其实是完全一样的![Page]
cout<<\"Buffer1 at \"<<(void*)buffer1<
int *p3,*p4,*p5;
p3=new int[20];
cout<<\"p0 at \"<
delete [] p3;
p4=new (buffer2) int [20];
cout<<\"p1 at \"<
p5=new (buffer2+100) int [20];
cout<<\"p2 at \"<
}
在上面的代码段中,对p1和p4使用了placement new操作符。这意味着,p1将使用以buffer1为首地址的内存块,而p4将使用以buffer2为首地址的内存块。下面的第二次使用placement new 操作符,p2将使用buffer1为首地址的内存块,而p5将使用buffer2首址+100的内存地址为起始地址的内存块。
程序在我机器上的输出如下:
Buffer1 at 0x437000
Buffer2 at 0x437040
p0 at 0x3d3e68
p3 at 0x3d3e88
p1 at 0x437000
p4 at 0x437040
p2 at 0x437000
p5 at 0x4370a4
int a;
delete a;
这反而会引发运行时错误。而你担心的p2将p1覆盖的问题,事实上并不会存在,但是p1和p2会指向同一块内存!我们可以在上面的程序的最下面加上这样的一段代码:
strcpy(p2->a,\"hello\");
p2->flag=100;