是否有可能防止对象的堆栈分配,只允许它与“新”实例化?

是否有可能防止对象的堆栈分配,只允许在堆上使用“新build”来进行堆栈分配?

你可以这样做的一种方法是使构造函数是私有的,只允许通过返回指针的静态方法进行构造。 例如:

class Foo { public: ~Foo(); static Foo* createFoo() { return new Foo(); } private: Foo(); Foo(const Foo&); Foo& operator=(const Foo&); }; 

在C ++ 11的情况下

 class Foo { public: ~Foo(); static Foo* createFoo() { return new Foo(); } Foo(const Foo &) = delete; // if needed, put as private Foo & operator=(const Foo &) = delete; // if needed, put as private Foo(Foo &&) = delete; // if needed, put as private Foo & operator=(Foo &&) = delete; // if needed, put as private private: Foo(); }; 

你可以使构造函数是private ,然后提供一个public静态工厂方法来创build对象。

以下允许公共构造函数,并通过在运行时抛出来停止堆栈分配。 注意thread_local是一个C ++ 11关键字。

 class NoStackBase { static thread_local bool _heap; protected: NoStackBase() { bool _stack = _heap; _heap = false; if (_stack) throw std::logic_error("heap allocations only"); } public: void* operator new(size_t size) throw (std::bad_alloc) { _heap = true; return ::operator new(size); } void* operator new(size_t size, const std::nothrow_t& nothrow_value) throw () { _heap = true; return ::operator new(size, nothrow_value); } void* operator new(size_t size, void* ptr) throw () { _heap = true; return ::operator new(size, ptr); } void* operator new[](size_t size) throw (std::bad_alloc) { _heap = true; return ::operator new[](size); } void* operator new[](size_t size, const std::nothrow_t& nothrow_value) throw () { _heap = true; return ::operator new[](size, nothrow_value); } void* operator new[](size_t size, void* ptr) throw () { _heap = true; return ::operator new[](size, ptr); } }; bool thread_local NoStackBase::_heap = false; 

您可以创build一个为对象提供抽象接口的头文件,以及返回指向在堆上创build的对象的指针的工厂函数。

 // Header file class IAbstract { virtual void AbstractMethod() = 0; public: virtual ~IAbstract(); }; IAbstract* CreateSubClassA(); IAbstract* CreateSubClassB(); // Source file class SubClassA : public IAbstract { void AbstractMethod() {} }; class SubClassB : public IAbstract { void AbstractMethod() {} }; IAbstract* CreateSubClassA() { return new SubClassA; } IAbstract* CreateSubClassB() { return new SubClassB; }