Ответ
Чтобы запретить создание объекта в динамической памяти (куче) с помощью оператора 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для данного типа, что полезно для контроля над временем жизни объектов или для классов, управляющих критичными ресурсами.