C++指针到指针作用域的问题



我有一个列表,其中存储指向对象指针的指针。我有一个函数,可以创建指向这些对象的指针,并将它们的地址存储在列表中(因此指针指向指针)。然而,一旦这个函数完成,指针就不再有效(对象是指针,但不是指针,因为它超出了范围),所以现在我的指针到指针就不起作用了。你是怎么解决的?

list<Actor**> lst;
void CreateEnemy()
{
    Actor* a = new Actor();
    lst.push_back(&a);
}
int _tmain(int argc, _TCHAR* argv[])
{
    CreateEnemy();
    // at this point the pointer to a pointer stored in lst isn't valid anymore because it went out of scope after CreateEnemy() completed.
}

这里有一个简单的例子,说明您可以根据自己的评论做些什么。

list<unique_ptr<Actor>> lst;
void CreateEnemy()
{
    lst.push_back(unique_ptr<Actor>(new Actor));
}
void KillRandomEnemies()
{
    for (auto& i : lst)
    {
        if (rand() % 100)
            i.reset();
    }
}    
class Projectile
{
public:
    Projectile(unique_ptr<Actor> & a)
        :actor(&a)
    {}
    bool IsTargetDead() const { return !(*actor); }
private:
    unique_ptr<Actor> * actor;
};
int main()
{
    CreateEnemy();
    Projectile proj(lst.front());
    while (something())
    {
        KillRandomEnemies();
        if (proj.IsTargetDead())
            whatever();
    }
}

只需使用std::list<Actor*>并存储指针。或者,更好的是std::list<Actor>。这里没有任何内容表明需要任何指针,更不用说指向指针的指针了。

试试这个:调用createEnemy:之后

Actor * a = * lst.front();
a -> some function.

这仍然有问题吗?

我在自己的课上测试了代码,结果很好。

最新更新