delete关键字和new关键字类似,主要有以下用法:

  • delete表达式
  • operator delete
  • 禁用函数

delete表达式

delete ptr

  1. 调用ptr所指向对象的析构函数。
  2. 调用operator delete()函数来释放ptr所指向的内存。

delete[] ptr

  1. 编译器读取ptr数组的长度。
  2. 从最后一个元素开始,逐一调用所有元素的析构函数。
  3. 调用operator delete[]()函数来释放整个内存块。

operator delete

operator delete全局函数是delete表达式背后的函数。它主要负责释放内存。

operator delete的版本非常多,详解链接

这里列出最基本的版本:

void operator delete (void* ptr ) throw();
void operator delete (void* ptr ) noexcept;

void operator delete[](void* ptr ) throw();
void operator delete[](void* ptr ) noexcept;

operator delete函数与operator new函数一样,也支持重载,也分为全局重载和类内重载。

禁用函数

禁用构造函数或赋值运算符

class Foo {
public:
    // ...

    Foo(const Foo&) = delete;
    Foo& operator=(const Foo&) = delete;
};

禁用特定类型的重载

class Foo {
public:
    void process(double d) { /*...*/ }
    void process(int i) = delete;
};

int main()
{
    Foo f;

    f.process(3.14); // OK
    f.process(10);   // 编译错误!该函数已被禁用
}