如何防止通过“新”运营商分配课程? (我想确保我的RAII类总是分配在堆栈上。)

我想确保我的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'来创buildX的一个实例。

要完成的事情,你应该隐藏'操作员删除'和两个操作员的arrays版本。

由于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; }; 

相关的问题: 是否有可能防止一个对象的堆栈分配,只允许它与“新”?

我不相信你的动机。

在免费商店里创buildRAII课程有很好的理由。

例如,我有一个RAII锁类。 我有一个通过代码的path,只有在某些条件成立时才需要locking(这是一个video播放器,如果我有一个video加载和播放,我只需要在渲染循环中保持locking;如果没有加载,我不需要它)。 在免费商店(使用scoped_ptr / auto_ptr)上创build锁的function非常有用。 它允许我使用相同的代码path,而不pipe我是否必须取出锁。

即这样的事情:

 auto_ptr<lock> l; if(needs_lock) { l.reset(new lock(mtx)); } render(); 

如果我只能在堆栈上创build锁,我不能这样做….

@DrPizza:

这是一个有趣的点,你有。 请注意,有些情况下RAII语言不一定是可选的。

无论如何,处理困境的一个更好的方法是向你的锁构造函数添加一个参数,以指示是否需要该锁。 例如:

 class optional_lock { mutex& m; bool dolock; public: optional_lock(mutex& m_, bool dolock_) : m(m_) , dolock(dolock_) { if (dolock) m.lock(); } ~optional_lock() { if (dolock) m.unlock(); } }; 

然后你可以写:

 optional_lock l(mtx, needs_lock); render(); 

在我的特殊情况下,如果不需要锁,那么互斥就不存在了,所以我认为这种方法会比较困难。

我想我真的很难理解的是禁止在免费商店创build这些对象的理由。