[INTERNAL] use boost::shared_ptr instead of raw pointer