Also FWIW, there is no need for dynamic allocation in this example. func_b could just as easily return an int by value and avoid the confusion of memory management altogether.
Although I suppose this is a trivial example for a more complex problem. If func_b was a factory that returned an abstract pointer, for example... then that would make sense (and yes, in that case I'd use a smart pointer).
Though in general... don't use dynamic allocation unless you have to.