我无法删除 QList <QByteArray*> 中的项目

I cannot delete an item in a QList <QByteArray*>

我正在尝试删除(空闲内存)QList 中指向 QByteArray 的指针的所有 QByteArray。这是我的代码:

在我的 .h 文件中

        QList<QByteArray*> GroupWord;                                   //declare the QList

在我的 .cpp 文件中

        quint8 k = GroupWord.length();                                  //get the last Index
        QByteArray& ref = *GroupWord.at(k - 1);                         //get the last Index
        qDebug() << "Length before deletion: " << GroupWord.length();   //print out the length before deletion
        qDebug() << "Before deletion: " << *GroupWord.at(k - 1);        //print out before del
        GroupWord.at(k - 1)->~QByteArray();                             //destroy the entry
        qDebug() << "Length after deletion: " << GroupWord.length();   //print out the length after deletion
        *GroupWord.at(k - 1)->append('l');                              //append to the 'assumed' deleted entry
        qDeleteAll(GroupWord);                                          //qDeleteAll the QList
        qDebug() << "After deletion 1: " << ref;                        //print out the ref to entry
        qDebug() << "After deletion 2: " << *GroupWord.at(k - 1);       //print out entry
        qDebug() << "After deletion 3: " << GroupWord.at(k - 1);        //print out the pointer
        GroupWord.clear();
        qDebug() << "After deletion 4: " << ref;                        //the memory is still there after ~QByteArray() and qDeleteAll() =(((((

以下是我如何知道有问题的 QByteArray 没有被删除:

QList 的长度在 ~QArrayByte() 之后仍然保持不变;

我真的不知道这里发生了什么:(

我知道我不应该这样声明变量,而只是将它传递到 voids 中;当 QList 超出范围时,它将被自动删除。但是,我只是想测试一下:(

非常感谢你们,

祝你有愉快的一天,:X

GroupWord.at(k - 1)->~QByteArray(); 销毁对象但不释放其动态存储的内存。您从未从 QList 中删除指针。存储对象本身而不是指针会......实际上 QList 会存储指针并开始管理对象,如果它们是 QObjectQList 太聪明了,它被设计成白痴证明)。如果您尝试调用析构函数,这将导致 UB。

QList“知道”它的长度只是因为调用它的方法,它跟踪它。您所做的破坏超出了它的范围:GroupWord.at(k - 1) 是对 QList 成员的调用,->~QByteArray(); 是对 QByteArray 方法在指针返回的对象上下文中的调用 at.

您几乎从不、从不显式地调用析构函数。实际需要它的极少数情况是一些事情,例如使用放置 new 分配对象,对于它们你不能调用 delete,因为存储不属于它们。

QList 在其中使用了一种新的放置形式,但随着 Qt 版本的不同而不同。重要的是它不是一个连续存储其元素的容器。如果您将指针存储在 QList<QByteArray*> 中,则必须手动删除它们,并且 delete 指向的对象(如果合适):小心双重删除或删除不是由 new 创建的内容。如果您使用 QList<QByteArray>QList 会自动管理它,但它总是会制作一个副本。