首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

std::make_shared

Defined in header <memory>

?

?

template< class T, class... Args > shared_ptr<T> make_shared( Args&&... args );

?

(since C++11)

构造类型的对象。T并将其包装在std::shared_ptr使用args的构造函数的参数列表。T对象的构造方式就像由表达式构造一样。::new(pv) T(std::forward<Args>(args)...),在哪里pv是内部的void*指向适于保存类型对象的存储的指针。T存储空间通常大于sizeof(T)为了对共享指针的控制块和T对象。

std::shared_ptr此函数调用的构造函数启用shared_from_this具有指向新构造的类型对象的指针。T...

参数

args

-

list of arguments with which an instance of T will be constructed.

返回值

std::shared_ptr类型实例的T...

例外

可抛std::bad_alloc的构造函数引发的任何异常。T如果抛出异常,则此函数没有任何效果。

注记

此函数可用作替代std::shared_ptr<T>(new T(args...)).权衡如下:

  • std::shared_ptr<T>(new T(args...))对对象执行至少两个分配%281T和一个用于共享指针%29的控制块,而std::make_shared<T>通常只执行标准推荐的一个分配%28,但不需要此,所有已知的实现都执行此%29。
  • 如果有的话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::shared_ptr支持C++17%29的数组类型%28 A,但是std::make_shared不会的。支持此功能。推动::使[医]共享

code such as f(std::shared_ptr<int>(new int(42)), g()) can cause a memory leak if g gets called after new int(42) and throws an exception, while f(std::make_shared<int>(42), g()) is safe, since two function calls are never interleaved.

(until C++17)

  • 代码,如f(std::shared_ptr<int>(new int(42)), g())会导致内存泄漏,如果g之后被调用。new int(42)并抛出一个异常,而f(std::make_shared<int>(42), g())是安全的,因为两个函数调用是永不交错...

%28直到C++17%29

构造者使shared_from_this用指针ptr类型U*意味着它决定U具有明确和可访问的基类,该基类是std::enable_shared_from_this,如果是这样,构造函数将计算语句:

二次

代码语言:javascript
复制
if (ptr != nullptr && ptr->weak_this.expired())
  ptr->weak_this = std::shared_ptr<std::remove_cv_t<U>>(*this,
                                  const_cast<std::remove_cv_t<U>*>(ptr));

二次

何地weak_this是隐藏的可变的std::weak_ptr成员std::shared_from_this.给弱者的任务[医]该成员不是原子成员,并且与对同一对象的任何可能并发访问相冲突。这确保了将来调用shared_from_this()将与shared_ptr由此原始指针构造函数创建。

试验ptr->weak_this.expired()在上面的解说代码中,确保弱[医]如果它已经指示了所有者,则不会重新分配。从C++17开始,就需要进行此测试。

二次

代码语言:javascript
复制
#include <iostream>
#include <memory>
 
void foo(const std::shared_ptr<int>& i)
{
    (*i)++;
}
 
int main()
{
    auto sp = std::make_shared<int>(12);
    foo(sp);
    std::cout << *sp << std::endl;
}

二次

产出:

二次

代码语言:javascript
复制
13

二次

另见

(constructor)

constructs new shared_ptr (public member function)

allocate_shared

creates a shared pointer that manages a new object allocated using an allocator (function template)

make_unique (C++14)

creates a unique pointer that manages a new object (function template)

代码语言:txt
复制
 ? cppreference.com

在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com