【问题标题】:Making a pair of shared pointer and pushing in a vector制作一对共享指针并推入一个向量
【发布时间】:2018-09-25 14:10:00
【问题描述】:

我正在尝试制作一对共享指针并将其推送到列表中并出现错误。 错误在list_of_objects_combination.push_back()这一行

我的代码有什么问题?

没有匹配的调用函数 'Objects::Objects(__gnu_cxx::__normal_iterator*, std::vector > >&)' { ::new((void *)__p) _Up(std::forward<_args>(__args)...); }

void MyClass::getCombination(std::vector<std::shared_ptr< Objects>> m_list_objects,
                                 std::vector<std::pair<std::shared_ptr<Objects>, std::shared_ptr<Objects>>> &list_of_objects_combination) {

    std::vector<std::shared_ptr< Objects>>::const_iterator objectIterator = m_list_objects.begin();
    std::vector<std::shared_ptr<Objects>>::const_iterator objectIteratorNext;

    for (; objectIterator < m_list_objects.end(); objectIterator++) {
        for (objectIteratorNext = objectIterator + 1; objectIteratorNext < m_list_objects.end();
             objectIteratorNext++) {

            list_of_objects_combination.push_back(std::make_pair(std::make_shared<Objects>(objectIterator),
                                                                 std::make_shared<Objects>(objectIteratorNext)));
        }
    }
}

【问题讨论】:

  • 您的 sn-p 可以从某些类型别名中受益。

标签: c++ vector shared-ptr


【解决方案1】:

您正在尝试从向量迭代器中创建一对:std::make_shared&lt;Objects&gt;(objectIterator),而不是 Objects/shared_ptrs。试试std::make_pair(*objectIterator, *objectIteratorNext)。这样您就可以避免代码中的另一个错误,因为您试图为现有对象创建新的shared_ptr,而不是复制现有对象。目前,即使 std::make_shared&lt;Objects&gt;(objectIterator)std::make_shared&lt;Objects&gt;(objectIterator-&gt;get()) 也会创建具有单独引用计数的新 shared_ptrs,这将导致双重删除/UB。

【讨论】:

  • 谢谢您。确实,在将迭代器推入列表之前,我必须取消对它的引用。 cpp 错误很神秘。
猜你喜欢
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-25
  • 1970-01-01
  • 2019-07-06
  • 2018-10-09
  • 2014-10-31
相关资源
最近更新 更多