【问题标题】:Initialization of dynamically allocated structures using shared pointer使用共享指针初始化动态分配的结构
【发布时间】:2019-05-11 13:46:44
【问题描述】:

我不明白为什么需要像这样初始化动态分配的结构(使用共享 ptr) 只是为了通知我正在使用 C++11

如果我们有这样的结构

struct Meme {
   std::string s;
   Meme* p;
}

稍后在代码中,我需要使用 shared_ptr 为这个结构动态分配内存,但我需要对结构进行即时初始化。 为什么会这样?

std::shared_ptr<Meme> novi=std::make_shared<Meme>(Meme{imena.at(i),nullptr});

让我困惑的部分是这个:

std::make_shared<Meme>(Meme{imena.at(i),nullptr});

如果我们设置 shared_ptr 指向 struct Meme,为什么我们需要再次指定初始化列表是针对 struct Meme,通过说

(Meme{imena.at(i),nullptr})

为什么这不起作用:

std::shared_ptr<Meme> novi=std::make_shared<Meme>({imena.at(i),nullptr});

这可能是因为没有直接使用 struct Meme(即使 make_shared 指向 struct Meme),初始化列表不能推断它应该转换为 struct Meme 吗?

【问题讨论】:

    标签: initialization structure shared-ptr dynamic-memory-allocation initializer-list


    【解决方案1】:

    make_shared 将参数转发给构造函数。

    制作 shared_ptr

    分配并构造一个 T 类型的对象将 args 传递给它的构造函数,并返回一个 shared_ptr 类型的对象,该对象拥有并存储一个指向它的指针(使用计数为 1)。 p>

    这会从您使用Meme{imena.at(i),nullptr} 创建的新实例中调用Meme 的复制构造函数。

    std::shared_ptr<Meme> novi=std::make_shared<Meme>(Meme{imena.at(i),nullptr});
    

    使用 make_shared 从转发参数构造它的正确方法是在 struct 中创建构造函数:

    struct Meme {
        std::string s;
        Meme* p;
        Meme(const std::string& s, Meme* p) : s(s), p(p) {}
    };
    
    std::shared_ptr<Meme> novi = std::make_shared<Meme>(imena.at(i),nullptr);
    

    您还可以使用(默认)空构造函数创建一个实例,然后设置其成员:

    struct Meme {
        std::string s;
        Meme* p = nullptr;
    };
    
    std::shared_ptr<Meme> novi = std::make_shared<Meme>;
    novi->s = imena.at(i);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-12
      • 1970-01-01
      • 2015-07-23
      • 2019-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多