四时宝库

程序员的知识宝库

C++:placement new(jsplacement官网)

C++提供了一种特殊的new语法,称为"放置new"(placement new),在动态内存分配时它允许将内存分配和对象的构造两个过程分离。placement new允许程序员在已经分配好的内存区域上进行对象的初始化,它可以接受一个内存地址作为其参数,表示对象的存储位置,可以使用普通内存,也可以使用其他特殊的内存池。

放置new常见用途:

1. 在已知的内存区域上构造对象。

2. 在有些场景下,普通new由于过多的调用而效率降低,我们可以预先分配一块连续的内存,组织为对象池,然后将这块内存作为参数传递给放置new,来手工构造对象,这种方式可以节省分配对象内存的时间。

放置new使用方法:

new (address) Class();

具体地,我们可以通过以下方式使用放置new:

#include <iostream>
#include <new>

class MyClass {
public:
	MyClass() : data(0) {}
	MyClass(int i) : data(i) {}
	void print() 
	{
    std::cout << data << std::endl;
  }
private:
	int data;
};

char memory[sizeof(MyClass)]; // 用于存放对象

int main () {
	MyClass *p1, *p2;
	// 使用常规new分配内存
	p1 = new MyClass(3);
	p1->print();
	delete p1;

  // 使用放置new,在已分配好的内存上构造对象
	p2 = new (memory) MyClass(6);
	p2->print();
	p2->~MyClass(); // 调用析构函数
	return 0;
}

在上面的示例中,我们首先使用常规的new语法动态分配了一个MyClass类型的对象,并设置了数据成员的值为3。然后我们使用放置new,在预先分配的内存上构造了另一个MyClass对象,并设置了数据成员的值为6。通过调用析构函数,我们释放了我们通过放置new得到的内存。

通过使用放置new,我们可以明确地控制内存的分配与初始化,同时可以更加高效地管理内存的使用和回收。需要注意的是,如果我们使用放置new来创建新的对象,我们需要手工调用对象的析构函数来释放内存。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接