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 T
和 new T[n]
在它们获取的内存中创建对象。
delete-expressions delete p
和 delete [] p
销毁对象并释放存储它们的内存。
operator new
是内存分配函数,operator delete
是内存释放函数。它们除了管理内存外什么都不做,对应于C的malloc
和free
。
他们使用这些名称是为了避免在语言中引入更多关键字——“operator new”和“operator delete”只是“allocate”和“deallocate”的时髦拼写方式。
::
是作用域解析运算符,确保这些调用专门针对全局作用域中定义的函数。
new-expressions和delete-expressions并不等同于这些函数,而是在后台使用它们进行内存管理。
如果你使用 operator new
分配内存,你还必须在该内存中创建一个对象,如果你使用 operator delete
释放内存,你应该首先销毁占用内存的对象。
operator new
通过为单个对象动态分配内存来工作,而 operator new[]
而是创建一个 array
对象。
在命令前放置 ::
告诉编译器使用该命令的全局命名空间定义,而不是您的代码中定义的任何可能的重载版本。
我正在观看一个关于数据结构以及如何制作我们自己的数据结构的 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 T
和 new T[n]
在它们获取的内存中创建对象。
delete-expressions delete p
和 delete [] p
销毁对象并释放存储它们的内存。
operator new
是内存分配函数,operator delete
是内存释放函数。它们除了管理内存外什么都不做,对应于C的malloc
和free
。
他们使用这些名称是为了避免在语言中引入更多关键字——“operator new”和“operator delete”只是“allocate”和“deallocate”的时髦拼写方式。
::
是作用域解析运算符,确保这些调用专门针对全局作用域中定义的函数。
new-expressions和delete-expressions并不等同于这些函数,而是在后台使用它们进行内存管理。
如果你使用 operator new
分配内存,你还必须在该内存中创建一个对象,如果你使用 operator delete
释放内存,你应该首先销毁占用内存的对象。
operator new
通过为单个对象动态分配内存来工作,而 operator new[]
而是创建一个 array
对象。
在命令前放置 ::
告诉编译器使用该命令的全局命名空间定义,而不是您的代码中定义的任何可能的重载版本。