c++ 中的 delete[] 和 ::operator delete() 有什么区别

What's the difference between delete[] and ::operator delete() in c++

我正在观看一个关于数据结构以及如何制作我们自己的数据结构的 youtube 系列。 但是后来导师把new[]换成了::operator new(),把delete[]换成了::operator delete(),有什么区别吗?因为这是我第一次看到 c++

中的 ::operator 东西

一般来说,::运算符被称为scope-resolution运算符。这种情况下的用法是可以选择函数的正确版本。如果您为某些 class 重载 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);
    }
};

new-expressions new Tnew T[n] 在它们获取的内存中创建对象。
delete-expressions delete pdelete [] p 销毁对象并释放存储它们的内存。

operator new是内存分配函数,operator delete是内存释放函数。它们除了管理内存外什么都不做,对应于C的mallocfree。 他们使用这些名称是为了避免在语言中引入更多关键字——“operator new”和“operator delete”只是“allocate”和“deallocate”的时髦拼写方式。

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

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

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

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

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