在C++中明确禁止堆分配

dic*_*oce 15 c++ heap new-operator

我有许多类,我想明确禁止堆分配.本周末我发现我可以声明操作符new private(并且未实现)......果然,当你尝试新的类时,这会导致编译错误......我的问题是:还有更多内容吗?我错过了什么,或者这是做我想要的好方法吗?

#include <stdio.h>

class NotOnTheHeap
{
public:
  NotOnTheHeap() : foo( 0 )
  {
  }

private:
  void *operator new( size_t );
  void operator delete( void* );
  void *operator new[]( size_t );
  void operator delete[]( void* );

  int foo;
};

class Heapable
{
private:
  NotOnTheHeap noth;
};

int main( int argc, char* argv[] )
{
  NotOnTheHeap noth;

  Heapable* heapable = new Heapable;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

oef*_*efe 11

取决于"明确禁止堆分配"的含义.

如果你只是想阻止在堆上直接分配,即:

NotOnTheHeap *n = new NotOnTheHeap();
Run Code Online (Sandbox Code Playgroud)

它够好了.但它不会阻止您的对象一般存在于堆上.

例如,它不会阻止人们使用std::vector <NotOnTheHeap>,它将从堆中的类中分配对象.

它也不会阻止人们NotOnTheHeap在堆上分配的另一个类中使用as成员变量.

  • 是的,我意识到这一点......这就是为什么我在示例中有"Heapable"...为了表明它仍然可以间接存在于堆上...... (3认同)
  • 明确指定分配函数`:: new A`也仍然有效. (2认同)