我正在开发的软件具有以下结构:
ClassA:
QHash<int, ClassB>
ClassB:
QHash<int, ClassC>
ClassC:
QMap<ID, QSharedPointer<ClassD> > (this is because I need to have the items ordered)
QHash<int, QSharedPointer<ClassD> > (this exists so I can access an item via id)
我的问题是,将要编辑的指针指向数据结构中的元素是否安全。我在尝试调试时遇到错误,其中调试器无法在断点处停止,并且出现 SIGTRAP 错误,但我不确定这是否与内存问题有关。
举一个更好的例子,与我正在开发的软件相关,我有一个 QHash<int, Take>
表示视频列表。用户一次只能编辑一个视频,所以我有一个指向当前视频的指针,它是哈希中的一个 Take。每个 Take 都有一堆可以编辑的参数,但最常见的是一个 QMap of Notes。这样做安全吗?
Take *currentTake = &takes[currentTakeId];
----//---
currentTake->addNote(new Note());
currentTake->changeSomeParameter();
etc
最佳答案
保留指向集合元素的指针/引用是否安全(或多长时间)取决于该集合。例如,std::vector
在重新分配时使指向它的所有指针无效,并且在没有重新分配的情况下删除/插入使插入/删除点之外的所有指针无效(好吧,更改它们指向的内容)。另一方面,std::list
是稳定的;只有指针指向的特定元素被删除时,指针才会失效。
集合通常应该记录其失效行为。不幸的是,Qt 集合没有。阅读他们的文档告诉我们,QMap
是一个红黑平衡二叉树,而 QHash
是一个单独的链接哈希表,因此它们都应该具有 std: :list
行为无效,但没有保证。 (例如,QHash
可以将头条目直接存储在桶列表中,这意味着重新散列会使大多数指针无效,而删除元素可能会使指向同一桶中元素的指针无效。)
关于c++ - 指向数据结构中元素的指针安全吗? (C++ 与 QT),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36918469/