0

我对从 QList 中删除元素有疑问。

“我的班级.h”:

class node2D : public QObject
{
    Q_OBJECT

public:
    node2D(){++s_NCount;};
    ~node2D(){--s_NCount;};

    int checkCount(){return s_NCount;};

private:
    static int s_NCount;
};

“myclass.cpp”:

int node2D::s_NCount = 0;

“主.cpp”:

void main()
{
    int i,max_el(4);
    QList<node2D*> *Nlist;
    Nlist = new QList<node2D*>;

    node2D controlNode;

    for (i = 0 ;i < max_el ; i++)
    {
        Nlist->append(new node2D);
    }

    cout << "Nlist size before: " << Nlist->size() << endl;
    cout << "Number of nodes before removing: " << controlNode.checkCount() << endl;

    Nlist->clear();
    cout << "NList size after: " << Nlist->size() << endl;
    delete Nlist;
    cout << "Number of nodes after removing: " << controlNode.checkCount() << endl;
}

执行后我得到:

  • 之前的 NList 大小:4
  • 移除前的节点数:5
  • 之后的 NList 大小:0
  • 移除后节点数:5

困扰我的是 node2D 对象的数量仍然是 5 而不是 1。

当然也可以这样管理:

for (i = 0; i < Nlist->size(); i++)
{
    delete (*Nlist)[i];
}
Nlist->clear();

但是不应该在 Nlist->clear() 时自动删除 node2D 对象吗?

还是只有在存在父子关系时才会发生?

提前致谢,

帕维尔

4

3 回答 3

3

但是不应该在 Nlist->clear() 时自动删除 node2D 对象吗?

一点也不。如果我想在其他地方使用这些对象怎么办,这主要是我的情况。管理您添加到列表中的指针所指向的对象是您的问题,而不是 QList 的问题。另一方面,管理这些指针的副本是 QList 的关注点。

于 2010-02-19T15:42:07.353 回答
2

我特别不熟悉 QT,但通常通用容器不会删除包含的销毁指针,因为在很多情况下这不是程序员想要的。它在 C++ STL 中以这种方式工作,我无法想象它在 QT 中的工作方式会有所不同。

如果您插入了Node2D 对象而不是指向 Node2D对象的指针,那么容器将制作包含对象的副本,并在列表被破坏时破坏这些副本。当您插入一个指针时,它会复制一个指针,而不是对象,因此它仍然由您(插入器)手动管理指向对象的生命周期。

于 2010-02-19T15:34:37.717 回答
1

在 QList 中,您只存储指向对象的指针。因此,如果您清除列表,则会删除对该指针的引用(也就是内存地址)。如果你想清除它自己的对象,你可以使用智能指针。事实上,您几乎应该总是使用智能指针。

试试这个

void main()
{
    int i,max_el(4);
    QList<QSharedPointer<node2D> > Nlist;


    node2D controlNode; //if you mixt QSharedPointer and objects like this, maybe you are better off using QExplicitelySharedDataPointer or QSharedDataPointer

    for (i = 0 ;i < max_el ; i++)
    {
        Nlist.append(QSharedPointer<node2D>(new node2D));
    }

    cout << "Nlist size before: " << Nlist.size() << endl;
    cout << "Number of nodes before removing: " << controlNode.checkCount() << endl;

    Nlist->clear();
    cout << "NList size after: " << Nlist.size() << endl;
    //delete Nlist;  not needed anymore since the list is not a pointer
    cout << "Number of nodes after removing: " << controlNode.checkCount() << endl;
}
于 2017-05-17T17:25:47.973 回答