use of smart pointers