本文主要是介绍C++ placement new 操作符,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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;
}
输出结果:
这篇关于C++ placement new 操作符的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!