Как запретить создание объекта на куче (heap) в C++

«Как запретить создание объекта на куче (heap) в C++» — вопрос из категории C++ Core, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Чтобы запретить создание объекта в динамической памяти (куче) с помощью оператора new, нужно удалить (или сделать приватными) соответствующие операторы new.

Современный способ (C++11 и новее): = delete

class StackOnly {
public:
    StackOnly() = default;
    // Удаляем операторы new
    void* operator new(std::size_t) = delete;
    void* operator new[](std::size_t) = delete;
    // Также можно удалить placement new для полноты
    void* operator new(std::size_t, void*) = delete;
};

int main() {
    StackOnly obj;          // OK: объект на стеке
    // StackOnly* p = new StackOnly();   // Ошибка: 'operator new' is deleted
    // StackOnly* arr = new StackOnly[5]; // Ошибка: 'operator new[]' is deleted
    return 0;
}

Устаревший способ (до C++11): приватные операторы new

class StackOnlyOld {
private:
    void* operator new(std::size_t);      // Не определяем
    void* operator new[](std::size_t);    // Не определяем
public:
    StackOnlyOld() {}
};

Важные нюансы:

  • Этот метод не препятствует созданию объекта в статической памяти (глобальные/статические переменные) или на стеке.
  • Он не препятствует созданию объекта как члена другого класса, который сам создается в куче.
  • Основная цель — предотвратить явное использование new для данного типа, что полезно для контроля над временем жизни объектов или для классов, управляющих критичными ресурсами.