use boost shared_ptr