У меня есть много классов, для которых я хотел бы явно запретить выделение "кучи". Мне в эти выходные пришло в голову, что я мог просто объявить оператор, новый частный (и нереализованный)... Конечно же, это приводит к ошибкам компиляции при попытке к новому класса... Мой вопрос: существует ли больше к этому? Я пропускаю что-то, или действительно ли это - хороший способ сделать то, что я хочу?
#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;
}
Зависит от того, что вы имеете в виду под «явно запретить выделение кучи».
Если вы просто хотите предотвратить прямое выделение памяти в куче , т.е.:
NotOnTheHeap *n = new NotOnTheHeap();
достаточно хорошо. Но это не предотвратит, что ваш объект вообще существует в куче.
Например, это не помешает людям использовать std :: vector
, который будет выделять объекты из вашего класса в куче.
Это также не помешает людям использовать NotOnTheHeap
в качестве переменной-члена в другом классе, который размещен в куче.
Это в основном поможет достичь того, что вы пытаетесь.
То, что ваше решение не охватывает, - это новая на месте, которая может находиться или не находиться в куче.
Вы не можете просто реализовать оператор new an assert (0 )?
Вы можете отключить копирование или даже конструкцию по умолчанию, а также operator = etc для более строгого сценария (некоторые случаи внедрения значений или использования контейнера).
Однако это переместит вас некоторых полезных конструкций и заставляет вас вводить свою собственную семантику (что-то более заметное в VM подразумевает; отсутствие / индукция аналогичного оператора и неоднозначные механизмы эквивалентности / равенства). Скорее всего, вы также увидите несколько предупреждений компилятора, это не произойдет до конца, но, если это хоть как-то утешит, можно использовать пару раз.