【问题标题】:Can C++0x still explicitly allocate with global operator new?C++0x 仍然可以使用全局运算符 new 显式分配吗?
【发布时间】:2011-04-17 16:15:23
【问题描述】:

Wikipedia 状态:

可以使用 operator new 使类型无法分配:

struct NonNewable {
    void *operator new(std::size_t) = delete;
};

这种类型的对象只能作为堆栈对象或其他类型的成员进行分配。如果没有不可移植的诡计,它就不能直接堆分配。 (由于放置 new 是在用户分配的内存上调用构造函数的唯一方法,并且如上所述已禁止这种使用,因此无法正确构造对象。)

删除 operator new 类似于在当前 C++ 中将其设为私有,但没有显式使用全局 operator new,从而避免了特定于类的查找,仍然有效 C++0x?

NonNewable *p = ::new NonNewable();
// neither non-portable nor trickery, though perhaps not widely known

我是否遗漏了草稿中的某些内容?


需要明确的是,这是有效的 C++03 和 works fine

struct NonNewable {
private:
  void *operator new(std::size_t);  // not defined
};

int main() {
  // ignore the leaks, it's just an example

  void *mem = operator new(sizeof(NonNewable));
  NonNewable *p = ::new(mem) NonNewable();

  p = ::new NonNewable();

  return 0;
}

【问题讨论】:

  • 仅供参考,如果您正在检查:引用的文本已从 Wikipedia 文章中删除。

标签: c++ c++11 new-operator


【解决方案1】:

我相信你是对的,而维基百科是错的。 C++0x 草案标准将“已删除函数”(8.4p10)描述为不能以任何方式使用的函数(否则程序格式错误)。它们在与普通函数不同的范围或名称查找中没有任何作用。并且关于新表达的相关段落保持不变:

[5.3.4p8] new-expression 通过调用分配函数 (3.7.4.1) 为对象获取存储空间。 ...

[5.3.4p9] 如果 new 表达式以一元 :: 运算符开头,则在全局范围内查找分配函数的名称。否则,如果分配的类型是类类型 T 或其数组,则在 T 的范围内查找分配函数的名称。如果查找失败,或者分配的类型不是类类型,则分配在全局范围内查找函数的名称。

所以是的,表达式::new NonNewable [或::new(mem) NonNewable] 将选择::operator new 的重载,忽略函数NonNewable::operator new,并且不会使程序格式错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多