我无法删除 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
会存储指针并开始管理对象,如果它们是 QObject
(QList
太聪明了,它被设计成白痴证明)。如果您尝试调用析构函数,这将导致 UB。
QList
“知道”它的长度只是因为调用它的方法,它跟踪它。您所做的破坏超出了它的范围:GroupWord.at(k - 1)
是对 QList
成员的调用,->~QByteArray();
是对 QByteArray
方法在指针返回的对象上下文中的调用 at
.
您几乎从不、从不显式地调用析构函数。实际需要它的极少数情况是一些事情,例如使用放置 new
分配对象,对于它们你不能调用 delete,因为存储不属于它们。
QList
在其中使用了一种新的放置形式,但随着 Qt 版本的不同而不同。重要的是它不是一个连续存储其元素的容器。如果您将指针存储在 QList<QByteArray*>
中,则必须手动删除它们,并且 delete
指向的对象(如果合适):小心双重删除或删除不是由 new
创建的内容。如果您使用 QList<QByteArray>
,QList
会自动管理它,但它总是会制作一个副本。
我正在尝试删除(空闲内存)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
会存储指针并开始管理对象,如果它们是 QObject
(QList
太聪明了,它被设计成白痴证明)。如果您尝试调用析构函数,这将导致 UB。
QList
“知道”它的长度只是因为调用它的方法,它跟踪它。您所做的破坏超出了它的范围:GroupWord.at(k - 1)
是对 QList
成员的调用,->~QByteArray();
是对 QByteArray
方法在指针返回的对象上下文中的调用 at
.
您几乎从不、从不显式地调用析构函数。实际需要它的极少数情况是一些事情,例如使用放置 new
分配对象,对于它们你不能调用 delete,因为存储不属于它们。
QList
在其中使用了一种新的放置形式,但随着 Qt 版本的不同而不同。重要的是它不是一个连续存储其元素的容器。如果您将指针存储在 QList<QByteArray*>
中,则必须手动删除它们,并且 delete
指向的对象(如果合适):小心双重删除或删除不是由 new
创建的内容。如果您使用 QList<QByteArray>
,QList
会自动管理它,但它总是会制作一个副本。