C++中,delete[]和::operator delete()有什么区别?

3

我正在观看一系列关于数据结构的Youtube视频,这些视频讲述如何创建自己的数据结构。但是,讲师将new[]替换为::operator new()并将delete[]替换为::operator delete(),这有什么区别吗?因为这是我第一次在C++中看到::operator

3个回答

3
一般来说,:: 运算符被称为作用域分辨符。在这种情况下使用它是为了选择正确版本的函数。如果你为某个类重载了 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);
    }
};

2

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

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


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

operator new是一个内存分配函数,operator delete是一个内存释放函数。它们只管理内存,不做其他事情,并对应于C的mallocfree。 它们有这些名称是为了避免引入更多的关键字到语言中 - "operator new"和"operator delete"只是拼写"allocate"和"deallocate"的奇特方式。

::是作用域解析运算符,确保这些调用特定于在全局范围内定义的函数。

新表达式和删除表达式与这些函数不等价,但在幕后使用它们进行内存管理。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接