Да, это даст висячий указатель. Если вы хотите, чтобы значение сохранялось, у вас есть несколько возможностей. Одна из них заключается в том, что, поскольку вы, очевидно, действительно хотите вернуть значение, сделайте именно это - верните значение вместо указателя. Другой способ - выделить объект, связанный с new, и вернуть указатель на это динамически распределенное пространство. Это делает удаление объекта ответственностью вызывающей стороны, однако, это может привести к утечкам памяти и тому подобному.
В конце концов, вы, как правило, хотите выяснить, какая область действия действительно нужна переменной, и владеть ли она чем-то (чаще всего объектом) с этой областью, поэтому она будет создана автоматически при входе в область, и уничтожается автоматически при выходе из области видимости.
Если вы не можете этого сделать, вам все равно нужно выяснить, кто «владеет» объектом, и будет отвечать за его уничтожение по мере необходимости. Время от времени это трудно определить, и вам нужно что-то вроде указателя с подсчетом ссылок, чтобы отслеживать вещи. По крайней мере, по моему опыту, они используются гораздо чаще, чем на самом деле. Я писал на C ++ почти столько же, сколько кто-либо за пределами AT & T, и еще не нуждался в shared_ptr. Несколько раз я думал, что мне это понадобится, но в конце концов придумал более чистый дизайн и устранил требование.