1

I am currently in the process of learning smart pointers and try to avoid using raw pointers.

I have a vector with shared ptrs

std::vector<std::shared_ptr<View>> mChildren;

and an Add and Remove method

void View::AddChild(std::shared_ptr<View> view) {
    mChildren.push_back(view);
}

void View::RemoveChild(std::shared_ptr<View> view) {
    auto removal = std::remove(mChildren.begin(), mChildren.end(), view);
    mChildren.erase(removal, mChildren.end());
}

Now in another part of my code I have a map

std::map<std::weak_ptr<ModelGem>,std::unique_ptr<ViewGem>,std::owner_less<std::weak_ptr<ModelGem>>> mViews;

Now when I try to remove elements from the map like this:

for (auto iterator = mViews.begin(); iterator != mViews.end();) 
{
    if (iterator->first.expired()) 
    {
        RemoveChild(iterator->second.get());
        iterator = mViews.erase(iterator);
    }
    else 
    {
        iterator++;
    }
}

Now the problem lies here : iterator->second.get() It tells me it cannot convert the rvalue of type pointer to shared ptr. However if I use raw pointers instead of shared pointers this is not an issue at at all.

So, I am wondering if in this case it would be better to just use raw pointers or can I work around this with shared pointers?

4

1 回答 1

1

所以,我想知道在这种情况下是否最好只使用原始指针或者我可以使用共享指针来解决这个问题?

在大多数情况下,只有一种右指针类型可供使用。这并不像一个比另一个更好。只有一种正确的方法。

该地图包含一个unique_ptr<ViewGem>. 这意味着它拥有完全的所有权,并且不与任何其他数据结构共享。因此,不可能在vector<shared_ptr...>不导致未定义行为的情况下拥有相同的对象。你必须决定哪个 ds 拥有自己的船,

  1. 如果地图拥有完整的所有权,使用unique_ptrin map 和 raw ptr in vector
  2. 如果vector有所有权,unique_ptr在vector中使用,在map中使用raw ptr。
  3. 如果所有权与 ds 都拥有,并且该对象仅在从 map 和 vector 中删除时才应销毁,则shared_ptr在两者中都使用 a。
于 2018-10-21T15:28:39.140 回答