приватный оператор delete в c ++ - PullRequest
9 голосов
/ 15 марта 2011

Я работаю над механизмом сбора мусора для семейства объектов в одном из моих проектов.Я хочу, чтобы эти объекты динамически выделялись с помощью new и никогда не вызывать delete.

. Это возможно путем перегрузки operator new для вызова специализированного объекта-распределителя, который реализует GC для этих объектов.(запуск коллекции, когда выделено слишком много памяти).Однако у меня есть проблема: пользователь все еще может просто сделать delete на этих объектах, и я не хочу этого.

Сделать operator delete приватным проблематично из-за того, как C ++ обрабатывает сбои в построении- если operator new публично, operator delete тоже должно быть.Альтернатива, которая иногда предлагается, состоит в том, чтобы сделать operator new и operator delete закрытыми и предоставить пользователю только методы создания фабрики.Я могу сделать это, но он кажется менее чистым и требует дополнительного кода для записи.

РЕДАКТИРОВАТЬ: Другой подход - сделать operator delete пустым (или сгенерировать исключение).Затем, чтобы фактически освободить объекты, мой GC явно вызовет деструктор, а затем освободит память с глобальным ::operator delete.

Есть еще идеи?

Ответы [ 3 ]

2 голосов
/ 15 марта 2011

Лично я думаю, что идея сделать частную и использовать фабрику - более чистый подход. Использование нового, но не удаления (или присвоение смарт-указателю) может сбить с толку многих разработчиков кода.

Если вы можете указать, что указатель происходит от фабрики, собранной 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;
        }
};
1 голос
/ 15 марта 2011

Перегрузка удаляется как неактивная.(требуется больше символов)

0 голосов
/ 15 марта 2011
boost::shared_ptr<Type> ptr = boost::make_shared<Type>(); 

Вы никогда не звоните новым, вы никогда не звоните удалить.

Зачем изобретать велосипед?Умные указатели - действительно путь.

...