关于QList<QList<UAVObject*>>内部列表指针有效性的技术问询
关于QList嵌套列表指针有效性的问题
没问题,我来给你把这个问题梳理清楚:
首先,你写的这段代码是完全合法的,确实能拿到内部列表的指针:
QList<QList<UAVObject *>> objects; // 假设objects已经初始化并包含至少一个元素 QList<UAVObject *>& ref = objects[0]; QList<UAVObject *>* pt = &ref;
然后关键的核心问题:在原objects列表仅执行添加操作、从不删除元素的前提下,pt的值会一直保持有效,原因如下:
- QList作为Qt的动态容器,当你只往它的尾部添加元素时,内存管理机制不会移动或销毁已经存在的元素。外层
objects里的每个内部QList对象的内存地址是固定的,后续的尾部添加操作只会在容器末尾分配新的内存空间,完全不会影响已有的元素位置。 - 跨函数调用时,只要
objects本身还存在(没有被销毁或超出作用域),pt指向的就是原内部列表的内存位置,完全可以正常访问。 - 另外,你对内部列表(也就是
*pt指向的QList)做任何操作(比如添加、删除它自己的UAVObject*元素),都不会影响pt的有效性——因为指针指向的是这个QList对象本身,而QList内部存储元素的变化不会改变QList对象自身的内存地址。
不过要提两个需要注意的边界情况:
- 如果
objects本身被销毁(比如超出作用域、被delete),那pt就会变成野指针,绝对不能再使用。 - 如果你以后修改了操作逻辑,比如往
objects中间插入元素、删除元素,或者调用了可能触发QList内存重新分配的操作(比如resize到更小的尺寸),那已有的内部列表指针/引用可能会失效,这时候就要重新获取了。
总结下来,在你当前的使用场景下,这个指针是安全可靠的,可以放心用。
内容的提问来源于stack exchange,提问作者ilya1725
相关产品推荐
相关产品推荐

