Другие ответили на основной вопрос: «Да, это законно». И в отсутствие большей архитектуры трудно назвать это хорошей или плохой практикой. Но я постараюсь развить философский подход к более широкому вопросу, который вы, похоже, задаете в отношении указателей, времени жизни объектов и ожиданий при вызовах функций ...
В языке C ++ нет встроенного способа передачи указателя на функцию и «принудительного применения», чтобы он не убирал ее после завершения вызова. А поскольку указатели C ++ по умолчанию являются « слабыми ссылками» , указанные объекты могут исчезнуть из-под кого-то, кому вы передадите его.
Но явно абстракции слабых указателей существуют, например, в Qt:
http://doc.qt.nokia.com/latest/qweakpointer.html
Они предназначены для особого кодирования «паранойи» получателю, что объект, за который он держится, может исчезнуть из-под него. Любой разыменовывающий один вид понимает, что что-то не так, и они должны принять надлежащие меры предосторожности в соответствии с контрактом на разработку.
Кроме того, существуют абстракции, такие как разделяемый указатель, которые сигнализируют получателю о другом понимании. Передав им один из них, вы получаете право сохранять объект живым так долго, как захотите, что дает вам что-то вроде сборки мусора:
http://doc.qt.nokia.com/4.7-snapshot/qsharedpointer.html
Это только некоторые варианты. Но в самом общем смысле, если вы придумаете любой интересный инвариант для времени жизни вашего объекта ... подумайте о том, чтобы не передавать необработанные указатели. Вместо этого передайте некоторый класс обтекания указателя, который воплощает и документирует правила «игры» в вашей архитектуре.
(Одна из основных причин использования C ++ вместо других языков - это множество инструментов, которые вы должны делать, например, без лишних затрат!)