use shard_ptr