我有许多我想明确禁止为其分配堆的类。这个周末我想到,我只能声明运算符(operator)为新的私有(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;
}

最佳答案

取决于“显式禁止堆分配”的含义。

如果您只想防止在堆上直接分配,即:

NotOnTheHeap *n = new NotOnTheHeap();

这已经足够了。但这通常不会阻止您的对象存在于堆中。

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

这也不会阻止人们将NotOnTheHeap用作分配在堆上的另一个类中的成员变量。

10-07 15:10