【发布时间】:2021-10-11 21:53:42
【问题描述】:
我最近了解了::operator new(unsigned long),它不调用构造函数,只分配内存。
- 为什么要在它前面使用
::这个东西?如果用户决定使用自定义重载,我不应该更喜欢使用自定义重载吗(我假设::使用函数的默认定义,但如果我不正确,我不会反对简短的解释) - 当我用
::operator new分配一个内存块(可能是一个数组)时,它是否记得这个内存地址处的块大小(就像new[]确实能够在以后使用delete[])?也就是说,我应该使用delete、operator delete(void*)还是operator delete(void*, size_t),或者甚至是delete[]?我也应该使用::吗? - 使用 g++,使用
::operator delete(void*, size_t)删除会在使用 c++11 编译时出错,但使用 c++14 可以正常编译。这是否意味着这些运算符是一个新功能?该错误表明它无法从size_t转换为void*。它想使用::operator delete(void*, void*)。 -
::operator delete(void*, void*)的定义是什么?是否一次删除到字节/缓冲区(不知道,请参见问题 2)?
这是非常具体的,我在网上没有找到信息,但我正在尝试制作一个矢量类,我想学习这个以便使用类中的运算符。
谢谢!
【问题讨论】:
-
我建议与operator new 和operator delete 一起开始。
-
如果你想要全局命名空间,使用
::;如果您使用new[],请使用delete[]并在同一个命名空间中执行它们。 -
你根本不应该使用
operator new(有或没有::),除非你正在编写一个分配器。这是很少有人做的事情。
标签: c++ operator-overloading new-operator operator-keyword delete-operator