new(p) T1(value)

本文详细解释了如何使用placement new在已预分配的内存空间创建对象,并提供了实例代码演示。此外,还讨论了placement new在STL中的应用及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这叫place   new,在指针p所指向的内存空间创建一个类型为T1的对象。调用的构造函数接受一个类型为const   T2&(或其他兼容类型)的参数

new   placement 
你可以简单的理解为C中的realloc,就是在已有空间的基础上,重新分配一个空间,可以不破坏原来数据,也可以把数据全部用新值覆盖 

一下是我搜集的一些笔记 
如果你想在预分配的内存上创建对象,用缺省的new操作符是行不通的。要解决这个问题,你可以用placement   new构造。它允许你构造一个新对象到预分配的内存上: 

//   buffer   是一个void指针   (void   *) 

//   用方括号[]   括起来的部分是可选的 

[CYourClass   *   pValue   =   ]   new(   buffer)   CYourClass[(   parameters)]; 

下面是一些例子: 

#include   <new 

class   CTest 



public: 

CTest() 

{} 

CTest(   int) 

{} 

/*   代码*/ 

}; 

int   main(int   argc,   char*   argv[]) 



//   由于这个例子的目的,我们不考虑内存对齐问题 

char   strBuff[   sizeof(   CTest)   *   10   +   100]; 

CTest   *   pBuffer   =   (   CTest   *)strBuff; 

//   缺省构造 

CTest   *   pFirst   =   new(pBuffer)   CTest; 

//   缺省构造 

CTest   *   pSecond   =   new(pBuffer   +   1)   CTest; 

//   带参数的构造; 

//   不理会的指针 

new(pBuffer   +   2)   CTest(   5); 

//   带参数的构造 

CTest   *   pFourth   =   new(   pBuffer   +   3)   CTest(   10); 

//   缺省构造 

CTest   *   pFifth   =   new(pBuffer   +   4)   CTest(); 

//   构造多个元素(缺省构造) 

CTest   *   pMultipleElements   =   new(pBuffer   +   5)   CTest[   5]; 

return   0; 



当你有自己的内存缓冲区或者在你实现自己的内存分配策略的时候,placement   new会很有用。事实上在STL中广泛使用了placement   new来给容器分配内存;每个容器类都有一个模版参数说明了构造/析构对象时所用的分配器(allocator)。 

在使用placement   new的时候,你要记住以下几点: 

加上头文件#include   <new   你可以用placement   new构造一个数组中的元素。   要析构一个用placement   new分配的对象,你应该手工调用析构函数(并不存在一个“placement   delete”)。它的语法如下: 

pFirst-~CTest(); 

pSecond-~CTest(); 

//.   .   .   等等

import javax.swing.*; import java.awt.*; import java.awt.event.*; public class calculator extends JFrame{ JPanel p0 =new JPanel(); JPanel p2 =new JPanel(); JPanel p3 =new JPanel(); JButton b11 =new JButton("CE");JButton b12 =new JButton("C");JButton b13 =new JButton("<-");JButton b14 =new JButton("/"); JButton b21 =new JButton("7");JButton b22 =new JButton("8");JButton b23 =new JButton("9");JButton b24 =new JButton("x"); JButton b31 =new JButton("4");JButton b32 =new JButton("5");JButton b33 =new JButton("6");JButton b34 =new JButton("-"); JButton b41 =new JButton("1");JButton b42 =new JButton("2");JButton b43 =new JButton("3");JButton b44 =new JButton("+"); JButton b1 =new JButton("0");JButton b2 =new JButton(".");JButton b3 =new JButton("="); JTextField t1=new JTextField(); public calculator(String title){ super(title); t1.setSize(new Dimension(360,100)); p0.add(t1,BorderLayout.NORTH); p0.add(p2,BorderLayout.CENTER); p0.add(p3,BorderLayout.SOUTH); this.setSize(360,600); p2.setLayout(new GridLayout(4,4)); p3.setLayout(new FlowLayout()); t1.setSize(new Dimension(350,100)); p2.add(b11);p2.add(b12);p2.add(b13);p2.add(b14); p2.add(b21);p2.add(b22);p2.add(b23);p2.add(b24); p2.add(b31);p2.add(b32);p2.add(b33);p2.add(b34); p2.add(b41);p2.add(b42);p2.add(b43);p2.add(b44); p3.add(b1);p3.add(b2);p3.add(b3); b1.setBounds(0,500,180,100);b1.setSize(new Dimension(180,100)); b2.setBounds(180,500,90,100);b2.setSize(new Dimension(90,100)); b3.setBounds(270,500,90,100);b3.setSize(new Dimension(90,100)); p2.setBounds(0,100,360,400); p3.setBounds(0,500,360,100); this.add(p0); this.add(p2); this.add(p3); } public static void main(String[] args) { calculator f =new calculator("计算器"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVis
最新发布
03-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值