我有许多类,我想明确禁止堆分配。本周末我发现我可以声明操作符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;
}
答案 0 :(得分:11)
取决于“明确禁止堆分配”的含义。
如果你只是想阻止在堆上直接分配,即:
NotOnTheHeap *n = new NotOnTheHeap();
这已经足够了。但是它不会阻止你的对象存在于堆中。
例如,它不会阻止人们使用std::vector <NotOnTheHeap>
,它将从堆中的类中分配对象。
它也不会阻止人们在另一个类中使用NotOnTheHeap
成员变量,这是在堆上分配的。
答案 1 :(得分:1)
这将主要实现您正在尝试的目标。
您的解决方案未涵盖的是就地新的,可能在堆上,也可能不在堆中。
答案 2 :(得分:1)
您可以禁用复制甚至默认构造,以及operator = etc以获得更严格的方案(某些嵌入值或容器使用的情况)。
然而,这将使你摆脱一些有用的结构并迫使你引入自己的语义(在VM impls中更明显;缺少/引入类似的运算符和模糊的等价/相等机制)。您可能也会看到一些编译器警告,它不会一直发生,但如果它有任何安慰,它可以有一两个使用。
答案 3 :(得分:0)
难道你不能让operator new的实现成为一个断言(0)吗?