make_shared返回值
看到不少人的代码中在使用 std::make_shared的时候,对于返回值进行了空指针判定,这是没有必要的。
首先关于malloc的返回值是这么说的:
成功时,返回指向新分配内存起始的指针。返回的指针必须用 std::free() 或 std::realloc()
解分配。
失败时,返回空指针
而对于make_shared是这样的。
类型 T
实例的 std::shared_ptr 。
异常
可能抛出 std::bad_alloc 或任何 T
构造函数所抛的异常。若抛出异常,则函数无效果。
为什么使用make_shared
此函数可用作 std::shared_ptr<T>(new T(args...)) 的替代品。得失是:
- std::shared_ptr<T>(new T(args...)) 进行至少二次分配(一次为
T
而另一次为共享指针的控制块),而 std::make_shared<T> 典型地仅进行一次分配(标准推荐但不要求如此,所有已知实现均如此)。 - 若任何 std::weak_ptr 在所有共享拥有者的生存期结束后引用
std::make_shared
所创建的控制块,则T
所占有的内存维持着,直至所有弱拥有者亦被销毁,若sizeof(T)
较大则这可能是不想要的。 - std::shared_ptr<T>(new T(args...)) 可能调用
T
的非公开构造函数,若在它可访问的语境中执行,而std::make_shared
要求对被选择构造函数的公开访问。 - 不同于 std::shared_ptr 构造函数,
std::make_shared
不允许自定义删除器。 std::make_shared
使用 ::new ,故若用类特定的 operator new 设置了任何特殊行为,则它将异于 std::shared_ptr<T>(new T(args...)) 。