C ++中的delete []和:: operator delete有什么区别

问题描述

我正在观看有关数据结构以及如何制作我们自己的数据结构的youtube系列。 但是随后讲师将new[]替换为::operator new(),将delete[]替换为::operator 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。 为了避免在语言中引入更多关键字,它们使用了这些名称-“ operator new”和“ operator delete”只是拼写“ allocate”和“ deallocate”的时髦方式。

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

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

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