我想确保我的RAII类总是在堆栈上分配.
如何通过"新"运算符阻止类分配?
您需要做的就是声明类'new operator private:
class X { private: // Prevent heap allocation void * operator new (size_t); void * operator new[] (size_t); void operator delete (void *); void operator delete[] (void*); // ... // The rest of the implementation for X // ... };
有效地使'operator new'私有化可以防止类外的代码使用'new'来创建X的实例.
要完成任务,您应该隐藏'operator delete'和两个运算符的数组版本.
从C++ 11开始,您还可以显式删除这些函数:
class X { // public, protected, private ... does not matter static void *operator new (size_t) = delete; static void *operator new[] (size_t) = delete; static void operator delete (void*) = delete; static void operator delete[](void*) = delete; };
相关问题: 是否可以防止对象的堆栈分配,并且只允许用"new"来填充它?
我不相信你的动力.
有充分的理由在免费商店创建RAII课程.
例如,我有一个RAII锁定类.我有一条通过代码的路径,只有在某些条件成立时才需要锁定(它是一个视频播放器,我只需要在渲染循环期间保持锁定,如果我有一个视频加载和播放;如果没有加载,我不需要它).因此,在free store上创建锁(使用scoped_ptr/auto_ptr)的能力非常有用; 它允许我使用相同的代码路径,无论我是否必须取出锁.
即是这样的:
auto_ptrl; if(needs_lock) { l.reset(new lock(mtx)); } render();
如果我只能在堆栈上创建锁,我就不能这样做....