0

I have question about removing element from QList.

"myclass.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;

"main.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;
}

After executing I get:

  • NList size before: 4
  • Number of nodes before removing: 5
  • NList size after: 0
  • Number of nodes after removing: 5

What's bothering me is the fact that number of node2D objects is still 5 instead of 1.

Of course it can be managed like this:

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

but shouldn't node2D objects be automatically deleted while Nlist->clear()?

Or does it only happen when there is parent-child relation?

Thanks in advance,

Pawel

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 に答える