частный оператор delete в c ++

Я работаю над механизмом сборки мусора для семейства объектов в одном из моих проектов. Я хочу, чтобы эти объекты динамически распределялись с помощью 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 .

Есть ли другие идеи?

9
задан Eli Bendersky 15 March 2011 в 18:55
поделиться