- 如果要在一个lambda表达式中使用一个shared_ptr对象的话,不要使用 [&] () { 内部使用 } 这样的方式。因为捕获列表不会给shared_ptr增加引用数。就有可能导致我们使用的时候shared_ptr已经销毁了。正确的使用方式是 [] (std::shared_ptr& obj) { 内部使用 }, 然后再用std::bind函数绑定shared_ptr对象到lambda表达式 ,这样shared_ptr就会增加引用计数,我们之后使用也不会有问题了。还有一种方式是在捕获列表使用=拷贝捕获。[=] () { 内部使用 },类似 [shared_ptr变量名] () { 内部使用 },两者本质上是一样的。
- 除非必要,尽量用 std::make_shared_ptr< T >() 的方式初始化shared_ptr指针,而不是 std::make_shared_ptr< T >(data) ,这样做将造成一次拷贝。某些必须要用外部数据初始化的可以这样写:
node(const T& data_) : data(std::make_shared<T>(data_)) {}
node(T&& data_) : data(std::make_shared<T>(std::move(data_))) {}