Явно запретите выделение "кучи" в C++

У меня есть много классов, для которых я хотел бы явно запретить выделение "кучи". Мне в эти выходные пришло в голову, что я мог просто объявить оператор, новый частный (и нереализованный)... Конечно же, это приводит к ошибкам компиляции при попытке к новому класса... Мой вопрос: существует ли больше к этому? Я пропускаю что-то, или действительно ли это - хороший способ сделать то, что я хочу?

#include <stdio.h>

class NotOnTheHeap
{
public:
  NotOnTheHeap() : foo( 0 )
  {
  }

private:
  void *operator new( size_t );
  void operator delete( void* );
  void *operator new[]( size_t );
  void operator delete[]( void* );

  int foo;
};

class Heapable
{
private:
  NotOnTheHeap noth;
};

int main( int argc, char* argv[] )
{
  NotOnTheHeap noth;

  Heapable* heapable = new Heapable;

  return 0;
}
15
задан Jon Seigel 7 April 2010 в 01:13
поделиться

4 ответа

Зависит от того, что вы имеете в виду под «явно запретить выделение кучи».

Если вы просто хотите предотвратить прямое выделение памяти в куче , т.е.:

NotOnTheHeap *n = new NotOnTheHeap();

достаточно хорошо. Но это не предотвратит, что ваш объект вообще существует в куче.

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

Это также не помешает людям использовать NotOnTheHeap в качестве переменной-члена в другом классе, который размещен в куче.

11
ответ дан 1 December 2019 в 04:40
поделиться

Это в основном поможет достичь того, что вы пытаетесь.

То, что ваше решение не охватывает, - это новая на месте, которая может находиться или не находиться в куче.

1
ответ дан 1 December 2019 в 04:40
поделиться

Вы не можете просто реализовать оператор new an assert (0 )?

0
ответ дан 1 December 2019 в 04:40
поделиться

Вы можете отключить копирование или даже конструкцию по умолчанию, а также operator = etc для более строгого сценария (некоторые случаи внедрения значений или использования контейнера).

Однако это переместит вас некоторых полезных конструкций и заставляет вас вводить свою собственную семантику (что-то более заметное в VM подразумевает; отсутствие / индукция аналогичного оператора и неоднозначные механизмы эквивалентности / равенства). Скорее всего, вы также увидите несколько предупреждений компилятора, это не произойдет до конца, но, если это хоть как-то утешит, можно использовать пару раз.

1
ответ дан 1 December 2019 в 04:40
поделиться
Другие вопросы по тегам:

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