打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
placement new机制初探
1.首先我们看第一个例子:
[cpp] view plaincopy
#include <iostream>
using namespace std;
typedef char byte;
int main()
{
byte *buffer = new byte[1000];
int *pi = new(buffer)int[10];
pi[0] = 3;
cout<<(int)*buffer<<endl;
delete []buffer;
return 0;
}
输出结果是3,说明内存的分配是在buffer里边的,其实也不能称之为内存分配,是在已经分配好的一部分内存空间里边来划分。
2.看第二个例子
[cpp] view plaincopy
#include <iostream>
typedef char byte;
using namespace std;
int main()
{
byte *buffer = new byte[1000];
int *p1 = new(buffer)int[10];
p1[0] = 3;
//输出第一个元素的值
cout<<(int)*buffer<<endl;
int *p2 = new(buffer)int[10];
p2[0] = 4;
//赋值以后输出第一个元素的值
cout<<(int)*(buffer)<<endl;
//再次输出第一个元素的值
cout<<p1[0]<<endl;
//输出这些地址
cout<<(int)buffer<<endl;
cout<<p1<<endl;
cout<<p2<<endl;
delete []buffer;
return 0;
}
发现,两次的内存分配都是从buffer的首地址开始的,所以我猜测,buffer里边仅仅允许分配一个(一组)对象的内存。
3.第三个例子
[cpp] view plaincopy
#include <iostream>
using namespace std;
class Integer
{
private:
int datum;
int a,b,c,d;
public:
Integer(int ival = 0)
{
a = b = c = d = datum = ival;
}
Integer(Integer const& rhs)
{
datum = rhs.datum;
}
Integer& operator = (Integer const& rhs)
{
datum = rhs.datum;
return *this;
}
~Integer()
{
cout << "~Integer" << endl;
}
operator int () const
{
return datum;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
int const ELEMENT_COUNT = 8;
unsigned char *buffer = new unsigned char [ELEMENT_COUNT * sizeof(Integer) + sizeof(int)];
Integer *data = new (buffer) Integer[ELEMENT_COUNT];
for (int i = 0; i < ELEMENT_COUNT; i++)
{
data[i].~Integer();
}
delete [] buffer;
return 0;
}
在申请buffer的时候需要多申请sizeof(int)的内存才不会出错,说明了编译器对用户自定义类型的存储方式---后边需要有sizeof(int)字节的内存来存储分配的空间等信息。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
简单的输入输出
93 f0312
并行 .NET 应用程序的过去、现在和未来
VC中关于BYTE, WORD, DWORD及其与2, 16进制之间的关系总结
闯关游戏C 代码
冒泡法排序
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服