У меня есть вопрос о том, как ограничить создание объекта на "куче" или стеке? Например, как удостовериться объект, не живущий на "куче"? как удостовериться объект, не живущий на стеке?
Спасибо!
Чтобы предотвратить случайное создание объекта в куче, предоставьте ему частные операторы new. Например:
class X {
private:
void *operator new(size_t);
void *operator new[](size_t);
};
Чтобы предотвратить случайное создание в стеке, сделайте все конструкторы закрытыми и / или сделайте закрытый деструктор и предоставьте дружественные или статические функции, которые выполняют те же функции. Например, вот тот, который делает и то, и другое:
class X {
public:
static X *New() {return new X;}
static X *New(int i) {return new X(i);}
void Delete(X *x) {delete x;}
private:
X();
X(int i);
~X();
};
Вы можете предотвратить объявление объекта с автоматической длительностью ("на стеке"), сделав его конструктор частным и предоставив фабрику (абстрактную фабрику или метод фабрики) для управления созданием новых объектов.
Вы можете попытаться предотвратить динамическое выделение объекта ("на куче"), сделав его оператор new
приватным. Однако это не помешает кому-то создать экземпляр вашего класса, используя размещение new
.
Почему вы хотите контролировать способ размещения вашего объекта? Какую проблему вы пытаетесь решить?
Чтобы предотвратить размещение объекта в стеке, определите частный деструктор. Это приводит к ошибке компиляции для объекта на основе стека, поскольку запрещает неявный вызов деструктора, когда объект на основе стека выходит за пределы области видимости. Вам нужно будет реализовать общедоступный метод уничтожения, что-то вроде:
void MyObject::destroy() const
{
delete this;
}
, чтобы очистить ваш объект, который размещен в куче. Обязательно прочтите Часто задаваемые вопросы по C ++ , где есть некоторые предостережения.
Аналогичным образом, чтобы предотвратить размещение объекта в куче, убедитесь, что оператор new
определен как частный.
Проще обеспечить создание объекта в куче. Оператор new
делает это всегда.
Сложнее гарантировать, что объект находится в стеке. Для небольших объектов при создании объекта типа MyType aObj;
всегда используется стек. Для объектов, классы которых занимают огромные объемы памяти, компилятор может не использовать стек.