Лично я думаю, что идея сделать частную и использовать фабрику - более чистый подход. Использование нового, но не удаления (или присвоение смарт-указателю) может сбить с толку многих разработчиков кода.
Если вы можете указать, что указатель происходит от фабрики, собранной GC (или принадлежит фабрике, собранной GC), то это сделает код менее запутанным для обслуживания. Используя фабрику, вы прямо заявляете, что фабрика ГХ является владельцем и, следовательно, должна поддерживать срок службы объекта:
class GCFactory
{
public:
template<T, P1>
T& createGCObject(P1 const& p1) // Or return by pointer.
{
T* result = new T(p1);
// Do stuff to register with garbage collector.
// Then return object (I like reference) but I have not studied the
// problem that hard so may be in-appropriate.
return * result;
}
template<T, P1, P2>
T& createGCObject(P1 const& p1, P2 const& p2)
{
T* result = new T(p1, p2);
// Do stuff to register with garbage collector.
return * result;
}
template<T, P1, P2, P3>
T& createGCObject(P1 const& p1, P2 const& p2, P3 const& p3)
{
T* result = new T(p1, p2, p3);
// Do stuff to register with garbage collector.
return * result;
}
};