Я просто хочу использовать функцию deleter shared_ptr без использования части shared_ptr. Как и в, я хочу вызвать функцию, когда shared_ptr выходит за пределы области видимости, и отладчик не нуждается в каком-либо указателе, переданном ему.Как использовать shared_ptr только для отправителя?
У меня есть это, но это cheezy.
shared_ptr<int> x(new int, [&](int *me) { delete me; CloseResource(); });
Есть ли способ не связывать любой указатель с shared_ptr?
Update: в соответствии с многими предложениями, то unique_ptr путь будет выглядеть следующим образом:
unique_ptr<int, std::function<void(int*)>> x(new int, [&](int *me) {delete me; CloseResource();});
Что откровенно выглядит хуже, чем версия shared_ptr, насколько «лучше», как это.
Обновления: для тех, кто любит, используя эту простую сферу закрытия функции вызывающего я сделал это немного проще, вам даже не нужно выделять или освобождать объект:
shared_ptr<int> x(NULL, [&](int *) { CloseResource(); });
'CloseResource' должен принимать указатель на ресурс, который он закрывает – Slava
Зачем вам нужен общий указатель. Почему бы просто не полагаться на сам объект, выходящий за рамки? –
Во-первых, использование 'unique_ptr' было бы более эффективным (предполагая, что вы не используете общий ресурс« shared_ptr »). Во-вторых, если вы можете использовать Boost, есть Boost.ScopeExit, который выполняет это. В-третьих, если вы не можете использовать Boost, [вы можете легко сделать свой собственный класс, который делает это] (http://stackoverflow.com/questions/3669833/c11-scope-exit-guard-a-good-idea), чтобы избегайте хакерского использования 'unique_ptr' /' shared_ptr'. – Cornstalks