So I don't have time right now to write the answer this needs, but I'll give you something to experiment with:
The base class vtkObject that contains the reference count used by vtkSmartPointer/vtkNew has a method you can call to see the reference count: GetReferenceCount. It is not recommended for applications to use this directly, but you can use it to experiment to see what happens to the reference count of an object at different points in your program.
As far as using vtkSmartPointer/vtkNew in functions here are some general tips:
If the object is a parameter of the function, then whoever called the function should guarantee that the object stays valid for the lifetime of the function call.
If you are creating the object in a function and want it to be deleted when the function exits use vtkSmartPointer/vtkNew to manage that (don't call Delete yourself--it is too easy to forget)
If you are returning a vtkObject from your function, you can change the return type to vtkSmartPointer (vtkNew doesn't work here)