Учитывая указатель на выделенную кучу память, как реализации интеллектуального указателя находят для него подходящую функцию освобождения? - PullRequest
0 голосов
/ 03 февраля 2020

Я пытаюсь создать собственную библиотеку интеллектуальных указателей в C ++, ради практики.

Теперь, я ДУМАЛ, что этот маленький проект будет легким, просто есть список указателей, другой список количество ссылок на указатель и класс интеллектуальных указателей для инкапсуляции всей этой сексуальной функциональности.

Ну, нет, конечно, все не так просто, и вскоре я столкнулся с проблемой. Учитывая произвольный указатель на память, выделенную из кучи, как мне написать свой класс, чтобы он каким-то образом в какой-то момент нашел правильную функцию удаления для использования в этом указателе (new -> delete, new [] -> delete [ ], malloc / reallo c -> free, et c.)

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

Я мог бы решить это, сделав абстрактный класс, а затем потребовать пользователи моей библиотеки могут использовать только классы, производные от нее, с моей реализацией интеллектуального указателя, но это кажется грубым и откровенно не поучительным.

Я искал некоторое время и просто не могу найти себе подходящего ответ. Таким образом, я здесь, чтобы спросить, может ли кто-нибудь из вас объяснить мне, как реальные реализации интеллектуальных указателей решают эту проблему, как они справляются с этими проблемами? Они вообще беспокоятся?

1 Ответ

1 голос
/ 03 февраля 2020

Умные указатели в стандартной библиотеке не пытаются магически определить соответствующую функцию освобождения. Они ожидают, что он будет предоставлен в качестве аргумента шаблона (std :: unique_ptr) или во время выполнения, например, в качестве аргумента конструктора (std :: shared_ptr). Если средство удаления не указано, по умолчанию используется delete для указателя на тип, не являющийся массивом, или delete[] для массива (как в std::unique_ptr<int[]>).

См. Также: std::default_delete

...