UP | HOME

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 个步骤

  1. 分配内存
  2. 静态转型
  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 个步骤:

  1. 析构函数
  2. 释放内存
Complex *c1 = new Complex(1, 2);

// 1. 析构函数
Complex::~Complex(c1);
// 2. 释放内存
operator delete(c1);

注意: delete 调用析构函数的时机和 new 申请次序是相反的

3. array new 一定要搭配 array delete

  1. array delete 会有唤醒次数

    String *s1 = new String[3];
    // ...
    delete[] s1; // 唤醒 3 次 dtor
    
  2. delete 只会唤醒 1 次析构函数

    String *s1 = new String[3];
    // ...
    delete s1; // 唤醒 1 次 dtor
    

Last Updated 2024-03-31 Sun 19:48. Created by Jinghui Hu at 2024-03-31 Sun 00:00.