Это действительно, вероятно, выделено из кучи, но без источников нет способа узнать.
Типичная реализация (взятая из некоторого кода, который я уже имел в emacs) была бы:
Singleton * Singleton::getInstance() {
if (!instance) {
instance = new Singleton();
};
return instance;
};
... и полагаться на то, что программа выйдет из области видимости после очистки.
Если вы работаете на платформе, где очистка должна выполняться вручную, я, вероятно, добавлю процедуру ручной очистки.
Другая проблема, связанная с этим, заключается в том, что он не является поточно-ориентированным. В многопоточной среде два потока могут пройти через «если», прежде чем любой из них сможет выделить новый экземпляр (так будут оба). Это по-прежнему не так уж и сложно, если вы все равно рассчитываете на завершение программы.