目录
前言
本文从c++new操作 实现原理入手,深入解读new ,operator new ,placement new,并配有相关的代码例程。
一、当我们new时,到底做了什么
对于new,熟悉c++的小伙伴绝对不陌生,一般我们需要什么对象直接new一下,然后用完之后记得要delete。简单方便,但是我们真的知道new做了什么吗?new又和operator new, placement new这些乱七八糟的又有什么关系的?
事实上,new主要做了两件事情:
1 new分配内存并且返回指向该内存块的指针
2 在该指针指向处调用对应的构造函数构造对象
只不过这些过程我们是看不到的,我们能看到的只是new,剩下的工作是由编译器在背后默默的替我们做了。(所以哪有什么岁月静好,只不过有人替我们负重前行哈哈哈)
如果我们来模拟一下new到底做了什么的话,应该是像下面这个样子:(我的环境是vs2017,在msvc系列编译器是可以这样调用的,在gnu系列的编译器下是会报错的,比如在devc++就会报错)
class A
{
public:
A() :i(0) {
cout << "constructor:" << this << " i" << i << endl; }
A(int x) :i(x) {
cout << "constructor:" << this << " i" << i << endl;}
~A(){
cout << "deconstructor:" << this << endl; }
private:
size_t i;
};
int main()
{
A* pa = (A*)malloc(sizeof(A));
pa->A::A(1); // 指向A的指针调用A的构造函数(gnu编译器下编译不通过)
pa->A::~A<