【问题标题】:questions about "::operator new"关于“::operator new”的问题
【发布时间】:2021-10-11 21:53:42
【问题描述】:

我最近了解了::operator new(unsigned long),它不调用构造函数,只分配内存。

  • 为什么要在它前面使用::这个东西?如果用户决定使用自定义重载,我不应该更喜欢使用自定义重载吗(我假设:: 使用函数的默认定义,但如果我不正确,我不会反对简短的解释)
  • 当我用::operator new 分配一个内存块(可能是一个数组)时,它是否记得这个内存地址处的块大小(就像new[] 确实能够在以后使用delete[])?也就是说,我应该使用deleteoperator 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 newoperator delete 一起开始。
  • 如果你想要全局命名空间,使用::;如果您使用 new[],请使用 delete[] 并在同一个命名空间中执行它们。
  • 你根本不应该使用operator new(有或没有::),除非你正在编写一个分配器。这是很少有人做的事情。

标签: c++ operator-overloading new-operator operator-keyword delete-operator


【解决方案1】:

为什么要在它前面使用 :: 这个东西?

如果您打算使用全局重载,则应该使用它,以防当前范围内存在您希望避免的重载。

当我用 ::operator new 分配一块内存(可能是一个数组)时,它是否记住了该内存地址处块的大小

实际上,隐式可替换重载必须记住。否则operator delete(void*) 无法工作。

使用 g++,使用::operator delete(void*, size_t) 删除在使用 c++11 编译时会出错,但使用 c++14 可以正常编译。这是否意味着这些运算符是新功能?

operator delete 的特定重载是在 C++14 中引入的。

::operator delete(void*, void*) 的定义是什么?

让我们看一下文档:

如果对象的构造函数抛出异常,则由标准的单对象放置 new 表达式调用。这个函数的标准库实现什么都不做。

【讨论】:

  • 谢谢!需要明确的是,当你说它必须记住大小时,这是否意味着我可以简单地对使用“operator new(size_t)”分配的任何内容使用“operator delete(void*)”?我不明白为什么会存在“operator delete(void*, size_t)”。
  • @glugau operator delete(void*, size_t) 存在,因此用户定义的重载可以使用不需要存储大小的不同实现。
猜你喜欢
  • 2012-01-03
  • 1970-01-01
  • 2017-09-22
  • 2011-07-13
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多