仅在堆栈上构造的类; 不是新的.C++

ano*_*non 6 c++

有没有办法创建一个类Foo

这样我才能做到:

Foo foo;
Run Code Online (Sandbox Code Playgroud)

但不是

Foo* foo = new Foo(); 
Run Code Online (Sandbox Code Playgroud)

我不希望人们能够在堆上分配Foo的副本.

谢谢!

编辑:对不起,我错了"只堆栈,不堆".我想说的是"不能使用新的运营商".

Ste*_*lly 16

阻止在堆上创建对象是不可能的.总有办法解决它.即使你设法operator new为Foo 隐藏,你仍然可以:

#include <new>

struct Foo {
        int x;
private:
        void* operator new (std::size_t size) throw (std::bad_alloc);
};

struct Bar
{
    Foo foo;
};

int main()
{
    Bar* bar = new Bar;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

嘿,你有一个Foo在堆上.

  • @Tom - 我不同意,关于"早期发现错误"的原则.我宁愿让编译器或链接器抱怨而不是程序在用户系统上崩溃.至于捕获异常,你打算如何解决它?例外是为了处理特殊的*运行时*问题,*不是*程序员错误. (7认同)

ken*_*ytm 6

让你的operator new私人.

#include <new>

struct Foo {
        int x;
private:
        void* operator new (std::size_t size) throw (std::bad_alloc);
};
Run Code Online (Sandbox Code Playgroud)

上的C++ 0x,你可以deleteoperator new:

struct Foo {
        int x;
        void* operator new (std::size_t size) throw (std::bad_alloc) = delete;
};
Run Code Online (Sandbox Code Playgroud)

请注意,您需要new[]单独为操作员执行相同操作.

  • 这将停止 Foo 的直接实例化,但很容易解决,请参阅我的答案。 (2认同)
  • 您可以绕过私有运算符 new 并直接使用全局操作 new : `::new Foo` 。 (2认同)

小智 5

在您的文档中,将"不要在堆上创建".解释为什么会是一个好主意.请注意,任何强制执行仅堆栈构造的尝试也会阻止该类在标准容器和类似类中使用 - 这不是一个好主意.