在 c++ 中 delete[] 和 ::运算符 delete() 有什么区别



我正在看一个关于数据结构以及如何制作我们自己的数据结构的YouTube系列。 但是后来教官用::operator new()代替了new[],用::operator delete()代替了delete[],有什么区别吗?因为这是我第一次看到 C++ 中::operator的东西

通常,::运算符称为范围解析运算符。在这种情况下,用法是为了可以选择函数的正确版本。如果重载operator delete()或某个类的operator new(),并且在实现中尝试对成员调用delete,则名称查找将仅找到重载版本。使用::operator delete()可以通过查看全局命名空间来解决此问题。

下面是来自 cppreference 的示例:

struct X {
static void operator delete(void* ptr, std::size_t sz)
{
std::cout << "custom delete for size " << sz << 'n';
::operator delete(ptr);
}
static void operator delete[](void* ptr, std::size_t sz)
{
std::cout << "custom delete for size " << sz << 'n';
::operator delete(ptr);
}
};

operator new通过为单个对象动态分配内存来工作,而operator new[]则创建一个array对象。

::放在命令之前会告诉编译器使用该命令的全局命名空间定义,而不是代码中可能已定义的任何可能的重载版本。

新表达式new Tnew T[n]在它们获取的内存中创建对象.
删除表达式delete pdelete [] p销毁对象并释放存储它们的内存。

operator new是内存分配函数,operator delete是内存释放函数。它们除了管理内存外不做任何事情,并且对应于 C 的mallocfree. 他们有这些名称是为了避免在语言中引入更多的关键字 - "运算符new"和"运算符删除"只是拼写"分配"和"解除分配"的时髦方式。

::是范围解析运算符,并确保这些调用专门针对全局作用域中定义的函数。

new-expression 和 delete-expression 不等同于这些函数,而是在后台使用它们进行内存管理。

如果使用operator new分配内存,则还必须在该内存中创建一个对象,如果使用operator delete释放内存,则应首先销毁占用内存的对象。

最新更新