2

我正在为一个类项目编写一些代码。其中一项任务是删除指向我们创建的类的指针集合。解决方案如下所示:

CDocument::~CDocument()
{
    for(std::list<CActor*>::iterator it = mActors.begin(); it != mActors.end(); it++)
    {
        delete *it;
    }

    mActors.clear();

}

我的解决方案如下所示:

CDocument::~CDocument()
{
    for(std::list<CActor*>::iterator it = mActors.begin(); it != mActors.end(); it++)
    {
        delete **it;
    }
}

我的困惑源于取消引用迭代器。我想从列表中删除 CActor 对象。在这种情况下,迭代器为我提供了一个指向指针的指针。为什么我要删除 CActor 指针 *it,而不是内存中的实际对象 **it?另外,为什么要额外的 mActors.clear()?

4

1 回答 1

3

因为delete对指针进行操作,而不是对象本身或对对象的引用。例如使用代码

int* a = new int;

a你会删除

delete a;

不是

delete *a;

至于为什么mActors.clear();存在,这不是绝对必要的,因为std::list析构函数会自动做同样的事情。但是,如果将更多代码添加到析构函数中,清除列表可确保以后不会意外使用所有这些悬空指针。

于 2013-10-24T01:56:57.977 回答