如何防止通过“新”运营商分配课程? (我想确保我的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这些对象的理由。