C++ 什么';s c+中delete[]和::operator delete()之间的区别+;

C++ 什么';s c+中delete[]和::operator delete()之间的区别+;,c++,data-structures,new-operator,delete-operator,C++,Data Structures,New Operator,Delete Operator,我在看youtube上的一个关于数据结构以及如何制作我们自己的数据结构的系列节目。 但随后讲师将新[]替换为::operator new(),将删除[]替换为::operator delete(),有什么区别吗?因为这是我第一次在c++中看到::操作符。通常,:操作符被称为范围解析操作符。这种情况下的用法是为了选择正确版本的函数。如果对某个类重载operator delete(),或operator new(),并且在实现内部,尝试对成员调用delete,则名称查找将只找到重载的版本。使用::o

我在看youtube上的一个关于数据结构以及如何制作我们自己的数据结构的系列节目。
但随后讲师将
新[]
替换为
::operator new()
,将
删除[]
替换为
::operator delete()
,有什么区别吗?因为这是我第一次在c++

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

下面是一个例子:

struct X{
静态void运算符删除(void*ptr,std::size\u t sz)
{

std::cout新表达式
newt
newt[n]
在内存中创建它们获取的对象。
delete表达式
delete p
delete[]p
销毁对象并释放存储它们的内存

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

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

新表达式和删除表达式并不等同于这些函数,而是在后台使用它们进行内存管理


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

operator new
通过为单个对象动态分配内存来工作,而
operator新[]
将创建一个
数组
对象

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

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);
    }
};