Как интерпретировать это утверждение «Указатель на функцию не должен представлять владение» - PullRequest
3 голосов
/ 07 марта 2012

На основании это

Страуструп предполагает, что «указатель на функцию не должен представлять владение»

Вопрос > Может кто-нибудь дать мне небольшое подробное объяснение? Лучше всего, если пример иллюстрируется.

Спасибо

Ответы [ 3 ]

9 голосов
/ 07 марта 2012

Указатель «принадлежит» некоторому коду, если этот код отвечает за его удаление или за передачу права собственности другому лицу.Различные умные указатели реализуют явные модели владения.shared_ptr представляет несколько фрагментов кода, имеющих указатель.unique_ptr представляет только один фрагмент кода, которому принадлежит указатель.

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

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

5 голосов
/ 07 марта 2012
std::unique_ptr<int> pOwner(new int(5)); // this is the owner
int* pAccess = pOwner.get(); // this is a weak accessor, it does not own anything

Он говорит о роли необработанных указателей в мире C ++ 11.Указатели-владельцы должны быть shared_ptr и unique_ptr (они являются владельцами, поскольку несут ответственность за удаление объекта).Необработанные указатели должны использоваться для доступа к объектам, которые принадлежат интеллектуальному указателю.В C ++ 11 у вас больше не должно быть причин явно вызывать delete для необработанного указателя.

1 голос
/ 08 марта 2012

Когда вы создаете динамический объект, используя new, какой-то другой объект будет отвечать за его удаление, когда он больше не нужен;этот объект является «владельцем» динамического объекта.

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

Широко используемое решение для этого состоит в том, чтобы всегда использовать умные указатели (объекты, которые похожи на указатели, но содержат логику для управления временем жизни своей цели) для обозначения владельцаи никогда не удалять ничего, на что у вас есть простой указатель.Тогда никогда не возникает путаницы в том, удалять или нет что-то.Стандартная библиотека предоставляет интеллектуальные указатели (unique_ptr и shared_ptr), которые предоставляют общую семантику владения одним объектом и разделяют владение несколькими объектами.

Это один из аспектов более широкой темы ресурсауправление через RAII , что чрезвычайно важно в C ++.Помимо предоставления четкой модели владения, это также единственный разумный способ надежно предотвратить утечки памяти при возникновении исключений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...