1.placement new 操作符可以在一块内存上面调用构造函数去构造一个对象。
2.operator new 操作符可以申请一块内存,返回该内存的指针void*。
通过这两个操作符的结合使用,可以延迟对象的构造,也可以避免重复的申请释放内存,而在一块内存上面不断地进行对象的构造析构,从而提高效率,并且减少了内存碎片的产生。
接下来举个例子,首先使用 operator new申请出一块Student大小的内存,然后再该内存上面不断地进行构造,析构,构造出的新对象调用函数PringName()打印当前学生的名字。最后使用operator delete释放该内存。
#include <iostream>
#include <string>
class Student {
public:
Student()
: name_("Default") {
std::cout << "Construct!" << std::endl;
}
Student(const std::string& name)
: name_(name) {
std::cout << "Construct!" << std::endl;
}
void PrintName() const {
std::cout << name_ << std::endl;
}
~Student() {
std::cout << "Deconstruct!" << std::endl;
}
private:
std::string name_;
};
int main() {
// 使用 operator new申请一块内存。
Student* s = static_cast<Student*>(operator new(sizeof(Student)));
// 使用placement new在该内存上面调用构造函数。
new (s)Student;
s->PrintName();
// 析构该对象。
s->~Student();
std::cout << std::endl;
for (std::size_t i = 0; i < 5; ++i) {
std::string name = "Name" + std::to_string(i);
// 使用placement new在该内存上面调用构造函数。
new (s)Student(name);
s->PrintName();
s->~Student();
std::cout << std::endl;
}
// 最后释放该内存。
operator delete (s);
return 0;
}
输出结果: