ограничьте создание объекта на "куче" и стеке в C++

У меня есть вопрос о том, как ограничить создание объекта на "куче" или стеке? Например, как удостовериться объект, не живущий на "куче"? как удостовериться объект, не живущий на стеке?

Спасибо!

7
задан skydoor 3 March 2010 в 18:08
поделиться

4 ответа

Чтобы предотвратить случайное создание объекта в куче, предоставьте ему частные операторы 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();
};
15
ответ дан 6 December 2019 в 08:42
поделиться

Вы можете предотвратить объявление объекта с автоматической длительностью ("на стеке"), сделав его конструктор частным и предоставив фабрику (абстрактную фабрику или метод фабрики) для управления созданием новых объектов.

Вы можете попытаться предотвратить динамическое выделение объекта ("на куче"), сделав его оператор new приватным. Однако это не помешает кому-то создать экземпляр вашего класса, используя размещение new.

Почему вы хотите контролировать способ размещения вашего объекта? Какую проблему вы пытаетесь решить?

3
ответ дан 6 December 2019 в 08:42
поделиться

Чтобы предотвратить размещение объекта в стеке, определите частный деструктор. Это приводит к ошибке компиляции для объекта на основе стека, поскольку запрещает неявный вызов деструктора, когда объект на основе стека выходит за пределы области видимости. Вам нужно будет реализовать общедоступный метод уничтожения, что-то вроде:

void MyObject::destroy() const
{
   delete this;
}

, чтобы очистить ваш объект, который размещен в куче. Обязательно прочтите Часто задаваемые вопросы по C ++ , где есть некоторые предостережения.

Аналогичным образом, чтобы предотвратить размещение объекта в куче, убедитесь, что оператор new определен как частный.

3
ответ дан 6 December 2019 в 08:42
поделиться

Проще обеспечить создание объекта в куче. Оператор new делает это всегда. Сложнее гарантировать, что объект находится в стеке. Для небольших объектов при создании объекта типа MyType aObj; всегда используется стек. Для объектов, классы которых занимают огромные объемы памяти, компилятор может не использовать стек.

0
ответ дан 6 December 2019 в 08:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: