如何使用智能指针执行此操作?

时间:2012-05-07 17:32:44

标签: c++ c++11 segmentation-fault smart-pointers weak-ptr

这就是我想要实现的目标:

#include <iostream>
using std::cout;

#include <vector>
using std::vector;

int main()
{
    vector<int> a {3, 7};

    int *p = &a.at (0); //assign 3

    for (int i = 0; i < 10; ++i) //swap and print (3,7,3...)
    {
        p = (*p == a.at (0) ? &a.at (1) : &a.at (0));
        cout << *p << '\n';
    }
}

我想使用智能指针而不是原始指针,看看它们如何更好,但无法真正弄清楚如何实现来回切换(这是用于在游戏中轮流使用) ;这是Player *)。

我尝试在两个单独的测试中使用std::unique_ptrstd::shared_ptr替换指针,使用reset进行切换,并在第一个之后给出随机数,如预期的那样。

接下来,我尝试使用std::weak_ptr,因为它看起来像我需要的,虽然界面并不是那么相似。从我看到的情况来看,使用它的唯一方法是通过lock(),因此我尝试将lock().添加到reset的调用中并将其附加到取消引用,但崩溃了。

如何使用std::weak_ptr代替原始指针,或者我可以以某种方式实际使用其中一个?

3 个答案:

答案 0 :(得分:4)

我认为您应该考虑使用std::vector::iterator而不是使用原始指针进行此类索引操作,请记住,对std::vector的任何插入操作都可能使迭代器无效。例如,您可以执行以下操作:

typedef std::vector<int>::iterator iter_t;

vector<int> a {3, 7};

iter_t p = iter_t(&a.at(0)); //assign 3

for (int i = 0; i < 10; ++i) //swap and print (3,7,3...)
{
    p = (*p == a.at(0) ? iter_t(&a.at(1)) : iter_t(&a.at(0)));
    cout << *p << '\n';
}

答案 1 :(得分:4)

根据定义,智能指针不是“更好”。只有当他们需要管理他们指向的内存时,它们才有用。

由于您的指针只是指向vector中的元素,因此您根本不需要智能指针。大多数智能指针会在超出范围时尝试删除他们指向的内存,在这种情况下会导致鼻子恶魔。

请注意,调整向量大小可能会导致所有指针无效。确保在指针仍在范围内时不添加或删除元素。

在这种情况下,玩家轮流,我可能根本不会使用指针,而是这样的:

int main()
{
    vector<int> players {3, 7};

    int current_player = 0;

    while (!game_over())
    {
        cout << players[current_player] << '\n';
        current_player = (current_player + 1) % players.size();
    }
}

答案 2 :(得分:0)

刚刚意识到你可能意味着你需要一个智能指针指向向量中的 int ,而不是将向量中的int更改为智能指针。我根本不会这样做。我将使用向量的迭代器:

for (int i = 0; i < 10; ++i) {
  auto it = it.begin() + (i % 2 ? 1:0);
  f(*it);
}

使用共享,唯一或任何其他指向向量内部的指针会导致坏的,坏的,坏的事情。使用原始指针也不合理,因为它们没有表明他们指向的内容。另一方面,向量的迭代器虽然可能是作为原始指针实现的,但它们有明确的文档规则,可以使用它们在代码中记录。

不要忘记“智能指针”包含迭代器。

相关问题