我正在观看一系列关于数据结构的Youtube视频,这些视频讲述如何创建自己的数据结构。但是,讲师将new[]
替换为::operator new()
并将delete[]
替换为::operator delete()
,这有什么区别吗?因为这是我第一次在C++中看到::operator
。
我正在观看一系列关于数据结构的Youtube视频,这些视频讲述如何创建自己的数据结构。但是,讲师将new[]
替换为::operator new()
并将delete[]
替换为::operator delete()
,这有什么区别吗?因为这是我第一次在C++中看到::operator
。
::
运算符被称为作用域分辨符。在这种情况下使用它是为了选择正确版本的函数。如果你为某个类重载了 operator delete()
或者 operator new()
,并且在实现中尝试调用一个成员的 delete
,名称查找将只会找到重载版本。使用 ::operator delete()
通过在全局命名空间中查找解决了这个问题。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 T
和new T[n]
在获取内存时创建对象。delete p
和delete [] p
销毁对象并释放它们所占用的内存。
operator new
是一个内存分配函数,operator delete
是一个内存释放函数。它们只管理内存,不做其他事情,并对应于C的malloc
和free
。
它们有这些名称是为了避免引入更多的关键字到语言中 - "operator new"和"operator delete"只是拼写"allocate"和"deallocate"的奇特方式。
::
是作用域解析运算符,确保这些调用特定于在全局范围内定义的函数。
新表达式和删除表达式与这些函数不等价,但在幕后使用它们进行内存管理。
如果您使用operator new
来分配内存,则必须在该内存中创建一个对象,如果您使用operator delete
释放内存,则应首先销毁占用内存的对象。