placement new

本文探讨了C++中的placement new操作符,它是operator new的一个重载版本,用于在已分配的内存上创建对象,而不进行额外的内存分配。通过placement new,可以在特定内存区域实例化对象,这在内存管理精细控制的场景下非常有用。文章举例说明了如何使用placement new创建和析构对象,并强调了需要手动调用析构函数以释放资源的重要性。
摘要由CSDN通过智能技术生成

我们看如下的代码:

class MyClass {}; 
MyClass * p=new MyClass;

这里使用的new是操作符而非函数,实际上,new操作符的执行过程分为三个阶段:
(1). 调用operator new分配内存,operator new(szieof(MyClass));实际上operator new函数会调用malloc函数去分配内存,但这不是本文的重点
(2). 调用构造函数生成类对象
(3). 返回相应的指针
而本文的重点placement new实际上是operator new的重载版本。如果想在已经分配的内存中创建一个对象,我们就需要用到它。大概用法如下:new §A();它会调用合适的构造函数在p指向的内存处创建一个对象,并返回一个指针,也就是说placement new并不会申请空间,只是在原有的空间上新建一个对象,因此,返回的指针和p实际上指向同一块区域
另外要注意的是,对象的空间并不会自动释放,实际上是借助别人的空间来创建对象,因此最后需要显式调用析构函数,p->~A();
实例:

#include <iostream>
using namespace std;
 
class A
{
public:
	A()
	{
		cout << "A's constructor" << endl;
	}
 
 
	~A()
	{
		cout << "A's destructor" << endl;
	}
	
	void show()
	{
		cout << "num:" << num << endl;
	}
	
private:
	int num;
};
 
int main()
{
	char mem[100];
	mem[0] = 'A';
	mem[1] = '\0';
	mem[2] = '\0';
	mem[3] = '\0';
	cout << (void*)mem << endl;
	A* p = new (mem)A;
	cout << p << endl;
	p->show();
	p->~A();
	getchar();
}

new关键字创建对象的时候,对于内置类型,加上()会初始化,不加()不会初始化;对于自定义类型,都会调用默认构造函数,加不加括号没有区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值