c++ - 指向数据结构中元素的指针安全吗? (C++ 与 QT)

标签 c++ qt pointers memory

我正在开发的软件具有以下结构:

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/

相关文章:

c++ - 将数组存储在单独的类文件中

c++ - 使结构表现得像 std::tuple

c++ - Visual Studio 2015 中的 Qt 项目 : "unresolved external symbol wWinMain"

C++ 递归指针函数调用

c - 为什么退出此函数后传递给指针参数的指针变量的值没有改变?

c++ - 原始指针管理

c++ - 关于windows窗体中多线程和后台工作线程的一些问题

c++ - QT 使用 MinGW 启用交叉编译(预编译)

c++ - Qt - qmake -project,qmake,下一步是什么?

c++ - BlackBerry 10 中的弹出窗口