C++ 对象的栈(stack)和堆(heap)
Table of Contents
1. new 关键字
假设我们实现了一个描述复数的 Complex
类
class Complex { public: Complex(double real, double imag) { this->m_real = real; this->m_imag = imag; } ~Complex() { // do nothing } private: double m_real; double m_imag; };
一个 new
申请对象内存会被编译器拆分成 3 个步骤
- 分配内存
- 静态转型
- 调用构造函数
// new 分配内存会被拆分以下 3 个过程 Complex *c1 = new Complex(1, 2); // 1. 分配内存 void * mem = operator new(sizeof(Complex)); // 编译器内部调用 malloc(...) // 2. 静态转型 c1 = static_cast<Complex*>(mem); // 3. 调用构造函数 c1->Complex::Complex(1, 2);
2. delete 关键字
一个 delete
释放对象内存会被编译器拆分成 2 个步骤:
- 析构函数
- 释放内存
Complex *c1 = new Complex(1, 2); // 1. 析构函数 Complex::~Complex(c1); // 2. 释放内存 operator delete(c1);
注意: delete
调用析构函数的时机和 new
申请次序是相反的
3. array new 一定要搭配 array delete
array delete 会有唤醒次数
String *s1 = new String[3]; // ... delete[] s1; // 唤醒 3 次 dtor
delete 只会唤醒 1 次析构函数
String *s1 = new String[3]; // ... delete s1; // 唤醒 1 次 dtor