Я работаю над механизмом сборки мусора для семейства объектов в одном из моих проектов. Я хочу, чтобы эти объекты динамически распределялись с помощью new
и никогда не вызывали delete
.
Это возможно, перегрузив оператор new
для вызова специализированный объект распределителя, который реализует GC для этих объектов (запускает сбор, когда было выделено слишком много памяти). Однако у меня проблема: пользователь по-прежнему может просто выполнить delete
для этих объектов, и я этого не хочу.
Сделать оператор delete
закрытым проблематично из-за того, как C ++ обрабатывает сбои при построении - если оператор new
является общедоступным, оператор delete
тоже должен быть. Иногда предлагается просто сделать оба оператора new
и operator delete
закрытыми и предоставить пользователю только методы создания фабрики. Я могу это сделать, но он кажется менее чистым и требует для написания дополнительного кода.
РЕДАКТИРОВАТЬ: Другой подход - сделать оператор delete
пустым (или выбросить исключение). Затем, чтобы фактически освободить объекты, мой GC вызовет деструктор явно, а затем освободит память с помощью глобального :: operator delete
. Я не хочу этого.
Сделать оператор delete
закрытым проблематично из-за того, как C ++ обрабатывает сбои при построении - если оператор new
является общедоступным, оператор delete
должен быть тоже. Иногда предлагается просто сделать оба оператора new
и operator delete
закрытыми и предоставить пользователю только методы создания фабрики. Я могу это сделать, но он кажется менее чистым и требует написания дополнительного кода.
РЕДАКТИРОВАТЬ: Другой подход - сделать оператор delete
пустым (или выбросить исключение). Затем, чтобы фактически освободить объекты, мой GC вызовет деструктор явно, а затем освободит память с помощью глобального :: operator delete
. Я не хочу этого.
Сделать оператор delete
закрытым проблематично из-за того, как C ++ обрабатывает сбои при построении - если оператор new
является общедоступным, оператор delete
должен быть тоже. Иногда предлагается просто сделать оба оператора new
и operator delete
закрытыми и предоставить пользователю только методы создания фабрики. Я могу это сделать, но он кажется менее чистым и требует для написания дополнительного кода.
РЕДАКТИРОВАТЬ: Другой подход - сделать оператор delete
пустым (или выбросить исключение). Затем, чтобы фактически освободить объекты, мой GC вызовет деструктор явно, а затем освободит память с помощью глобального :: operator delete
.
Сделать оператор delete
закрытым является проблематичным из-за того, как C ++ обрабатывает сбои при построении - если оператор new
является общедоступным, оператор delete
тоже должен быть. Иногда предлагается просто сделать оба оператора new
и operator delete
закрытыми и предоставить пользователю только методы создания фабрики. Я могу это сделать, но он кажется менее чистым и требует написания дополнительного кода.
РЕДАКТИРОВАТЬ: Другой подход - сделать оператор delete
пустым (или выбросить исключение). Затем, чтобы фактически освободить объекты, мой GC вызовет деструктор явно, а затем освободит память с помощью глобального :: operator delete
.
Сделать оператор delete
частным является проблематичным из-за того, как C ++ обрабатывает сбои при построении - если оператор new
является общедоступным, оператор delete
тоже должен быть. Иногда предлагается просто сделать оба оператора new
и operator delete
закрытыми и предоставить пользователю только методы создания фабрики. Я могу это сделать, но он кажется менее чистым и требует для написания дополнительного кода.
РЕДАКТИРОВАТЬ: Другой подход - сделать оператор delete
пустым (или выбросить исключение). Затем, чтобы фактически освободить объекты, мой GC вызовет деструктор явно, а затем освободит память с помощью глобального :: operator delete
. оператор delete
тоже должен быть. Иногда предлагается просто сделать оба оператора new
и operator delete
закрытыми и предоставить пользователю только методы создания фабрики. Я могу это сделать, но он кажется менее чистым и требует для написания дополнительного кода.
РЕДАКТИРОВАТЬ: Другой подход - сделать оператор delete
пустым (или выбросить исключение). Затем, чтобы фактически освободить объекты, мой GC вызовет деструктор явно, а затем освободит память с помощью глобального :: operator delete
. оператор delete
тоже должен быть. Иногда предлагается просто сделать оба оператора new
и operator delete
закрытыми и предоставить пользователю только методы создания фабрики. Я могу это сделать, но он кажется менее чистым и требует для написания дополнительного кода.
РЕДАКТИРОВАТЬ: Другой подход - сделать оператор delete
пустым (или выбросить исключение). Затем, чтобы фактически освободить объекты, мой GC вызовет деструктор явно, а затем освободит память с помощью глобального :: operator delete
. но он кажется менее чистым и требует для написания дополнительного кода.
РЕДАКТИРОВАТЬ: Другой подход - сделать оператор delete
пустым (или выбросить исключение). Затем, чтобы фактически освободить объекты, мой GC вызовет деструктор явно, а затем освободит память с помощью глобального :: operator delete
. но он кажется менее чистым и требует для написания дополнительного кода.
РЕДАКТИРОВАТЬ: Другой подход - сделать оператор delete
пустым (или выбросить исключение). Затем, чтобы фактически освободить объекты, мой GC вызовет деструктор явно, а затем освободит память с помощью глобального :: operator delete
.
Есть ли другие идеи?