В любом случае, будьте последовательны и очевидны в отношении того, что они должны делать.
Меняется ли количество мониторов?
Если нет, я бы сказал, что вам лучше оставить одну версию и сохранить право собственности. Не позволяйте или заставляйте пользователей уничтожать их.
Если это так, вернуть общий / автоматический указатель или что-то копируемое. Я подозреваю, что последний вариант является правильным, если только создание и уничтожение ваших ссылок на внутреннее устройство не обходится слишком дорого. Это умозрительно, хотя.
Функции инициализации / очистки в вашем главном не красивы и не изящны, но они эффективны и очень прямо сообщают о ваших намерениях.
Другой (на мой взгляд, лучший) вариант - вообще не возвращать объект. Просто выставьте статические функции с индексами монитора:
size_t GetNumMonitors();
void GetMonitorSize(size_t idx, int &x, int &y);
void SetMonitorSize(size_t idx, int x, int y);
Если вам действительно нужен дизайн объекта, скройте его за этим (или похожим) интерфейсом. Это освобождает пользователя от работы с вашей реализацией.