我有许多我想明确禁止为其分配堆的类。这个周末我想到,我只能声明运算符(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
用作分配在堆上的另一个类中的成员变量。