我想强制我的对象在堆栈上以强制执行非常严格的语义并解决一些生命周期问题。我已经阅读了几篇关于如何做到这一点的文章,并最终将其设为operator new
私有(或删除)。new
直接使用时,这似乎按预期工作,但make_shared
编译得很好。
#include <boost/smart_ptr.hpp>
class A
{
private:
void *operator new( size_t );
void operator delete( void* );
void *operator new[]( size_t );
void operator delete[]( void* );
};
int main()
{
// A* a = new A; // Correctly produces compile error
boost::shared_ptr<A> a2 = boost::make_shared<A>();
}
直接使用new A
会按预期给我这个错误:
error: ‘static void* A::operator new(size_t)’ is private
我猜这make_shared
是可行的,因为它使用了placement new 运算符,但我找不到任何讨论如何禁止此操作的文章。我想出的最佳解决方案是显式删除模板专业化make_shared
namespace boost
{
template<>
shared_ptr<A> make_shared<A>() = delete;
};
这显然是非常具体的boost::make_shared
。这真的是最好的方法吗?