Как предотвратить распределение classа с помощью «нового» оператора? (Я бы хотел, чтобы мой class RAII всегда был выделен в стеке.)

Я бы хотел, чтобы мой class RAII всегда был выделен в стеке.

Как предотвратить распределение classа с помощью «нового» оператора?

Все, что вам нужно сделать, это объявить class новым оператором:

class X { private: // Prevent heap allocation void * operator new (size_t); void * operator new[] (size_t); void operator delete (void *); void operator delete[] (void*); // ... // The rest of the implementation for X // ... }; 

Создание «operator new» private эффективно предотвращает использование кода за пределами classа «new» для создания экземпляра X.

Чтобы выполнить все, вы должны скрыть «оператор delete» и версии массива обоих операторов.

Начиная с C ++ 11 вы также можете явно удалить функции:

 class X { // public, protected, private ... does not matter static void *operator new (size_t) = delete; static void *operator new[] (size_t) = delete; static void operator delete (void*) = delete; static void operator delete[](void*) = delete; }; 

Связанный вопрос: возможно ли предотвратить выделение стека объектом и разрешить его только «новым»?

Я не убежден в вашей мотивации.

Есть веские причины для создания classов RAII в бесплатном магазине.

Например, у меня есть class блокировки RAII. У меня есть путь через код, где блокировка необходима только в случае определенных условий (это видеопроигрыватель, и мне нужно удерживать блокировку во время цикла рендеринга, если у меня загружено и воспроизводится видео, если ничего не загружено, Мне это не нужно). Таким образом, возможность создания блокировок в свободном хранилище (с scoped_ptr / auto_ptr) очень полезна; он позволяет мне использовать один и тот же код, независимо от того, должен ли я вынимать блокировку.

т.е. что-то вроде этого:

 auto_ptr l; if(needs_lock) { l.reset(new lock(mtx)); } render(); 

Если бы я мог создавать блокировки в стеке, я бы не смог этого сделать.

@DrPizza:

Это интересный момент, который у вас есть. Обратите внимание, что есть ситуации, когда идиома RAII необязательно является необязательной.

Во всяком случае, возможно, лучший способ приблизиться к вашей дилемме – добавить параметр к конструктору блокировки, который указывает, нужна ли блокировка. Например:

 class optional_lock { mutex& m; bool dolock; public: optional_lock(mutex& m_, bool dolock_) : m(m_) , dolock(dolock_) { if (dolock) m.lock(); } ~optional_lock() { if (dolock) m.unlock(); } }; 

Тогда вы могли бы написать:

 optional_lock l(mtx, needs_lock); render(); 

В моей конкретной ситуации, если блокировка не нужна, мьютекс вообще не существует, поэтому я думаю, что подход будет гораздо сложнее.

Я думаю, что я действительно пытаюсь понять, это оправдание запрета на создание этих объектов в свободном магазине.

  • Какие законные причины существуют для перегрузки унарного оператора?
  • MATLAB: Возможно ли перегрузить операторы по собственным конструкциям (ячейкам, структурам и т. Д.)?
  • Сделать оператор << виртуальным?
  • Почему объект istream может использоваться как выражение bool?
  • объявление друга объявляет функцию без шаблона
  • Есть ли способ перегрузки методов в TypeScript?
  • Перегрузка оператора индексирования индексов индексирования C ++ таким образом, чтобы можно было отвечать на обновления
  • Перегрузка оператора с помощью методов расширения C #
  • Как я должен писать стандартные стандартные и удаленные операторы ISO C ++ Standard?
  • Положительная lambda: '+ {}' - Какое волшебство?
  • перегрузка оператора друга << для шаблона classа
  • Interesting Posts

    Spring @Transactional для чтения только для чтения

    Открытие папки в проводнике и выбор файла

    Вернуть строку JSON явно из Asp.net WEBAPI?

    Встроенный RAID и программный RAID

    Вычисление факториала больших чисел в C

    Это регулярное выражение не работает в c ++

    множественная ошибка определения, включая заголовочный файл c ++ со встроенным кодом из нескольких источников

    Java: каково большое время для объявления массива размера n?

    Программа не содержит статический «Основной» метод, подходящий для точки входа

    Исключать определенные расширения файлов при получении файлов из каталога

    R: ускорение операций «по группам»

    Использование запроса Hibernate: двоеточие обрабатывается как параметр / экранирование двоеточия

    Фоновый рисунок ActionBar

    Фундаментальное различие между алгоритмами Hashing и Encryption

    Нужна ли мне инъекция зависимостей в NodeJS или как бороться с …?

    Давайте будем гением компьютера.