我无法删除 QList <QByteArray*>

问题描述

我试图删除(空闲内存)在指向 QByteArray 的指针的 QList 中的所有 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()之后仍然保持不变;

enter image description here

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

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

非常感谢你们,

祝你有美好的一天,:X

解决方法

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

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

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

QList 在其中使用了一种新的放置形式,但随着 Qt 的不同版本而变化。重要的是它不是一个连续存储其元素的容器。如果您将指针存储在 QList<QByteArray*> 中,则必须手动删除它们并在适当的情况下将 delete 指向对象:注意双重删除或删除不是由 new 创建的内容。如果您使用 QList<QByteArray>QList 会自动管理它,但它始终会复制一份。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...