C++ New::operator delete



C++ New::operator delete是一个常规函数,可以像其他任何函数一样显式调用。但是,在C++中,delete是一个具有非常特定行为的操作符:包含delete操作符的表达式首先调用正确的析构函数(对于类类型),然后调用释放函数。

如果存在,名为operator delete的成员函数将作为类对象的释放方法。在所有其他情况下,它是一个全局函数操作符,称为delete。如果delete语句前面带有作用域运算符,则只考虑全局释放函数。

语法

以下是C++ New::operator delete的语法:

void operator delete (void* ptr) throw();	(ordinary delete)
void operator delete (void* ptr, const std::nothrow_t& nothrow_constant) throw();	    (nothrow delete)
void operator delete (void* ptr, void* voidptr2) throw();             (placement delete)

参数

  • size − 包含请求的内存块的大小(以字节为单位)。
  • nothrow_value − 包含常量nothrow。
  • ptr − 指向已分配的适当大小的内存块的指针。
  • voidptr2 − 一个void指针。

示例1

让我们来看下面的例子,我们将使用operator delete并获取输出。

#include <cstdio>
#include <cstdlib>
#include <new>
void operator delete(void* ptr, std::size_t size) noexcept {
   std::printf("delete(void*, size_t), size = %zu\n", size);
   std::free(ptr);
}
int main() {
   int* p1 = new int;
   delete p1;
}

输出

让我们编译并运行上面的程序,这将产生以下结果:

delete(void*, size_t), size = 4

示例2

让我们来看另一个场景,我们将使用operator delete并使用delete和delete[]获取输出。

#include <iostream>
struct a {
   static void operator delete(void* ptr, std::size_t sz) {
      std::cout << "operator delete: " << sz << '\n';
      ::operator delete(ptr);
   }
   static void operator delete[](void* ptr, std::size_t sz) {
      std::cout << "operator delete[]: " << sz << '\n';
      ::operator delete[](ptr);
   }
};
int main() {
   a* p1 = new a;
   delete p1;
   a* p2 = new a[12];
   delete[] p2;
}

输出

运行上面的代码后,它将显示如下输出:

operator delete: 1
operator delete[]: 20

示例3

考虑以下情况,我们将检查operator delete的功能。

#include <iostream>
struct MyClass {
   MyClass() {std::cout <<"It is a MyClass() constructed\n";}
   ~MyClass() {std::cout <<"It is a MyClass() destroyed\n";}
};
int main () {
   MyClass * pt = new (std::nothrow) MyClass;
   delete pt;
   return 0;
}

输出

代码执行后,将生成如下输出:

It is a MyClass() constructed
It is a MyClass() destroyed
广告