【发布时间】:2016-04-28 15:00:16
【问题描述】:
我正在开发的软件具有以下结构:
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 都有一堆可以编辑的参数,但最常见的是 Notes 的 QMap。做这样的事情安全吗?
Take *currentTake = &takes[currentTakeId];
----//---
currentTake->addNote(new Note());
currentTake->changeSomeParameter();
etc
【问题讨论】:
-
也许如果您描述您的任务而不是您开发的当前解决方案,那么有人将能够找到更好的解决方案?我的意思是:您可以将实际任务描述添加到问题文本中吗?
-
维护指针在数据结构中与其他任何地方没有太大区别。您必须确保在您的过程中没有人删除您的指针,或者使用QPointer 或QSharedPointer 并对其进行测试。您的问题可能更多与设计有关:清楚地了解对象的生命周期,避免使用全局变量,在有意义时使用引用(当您确定对象至少与引用变量一样长时)。
-
@AlexanderVX 我不是 100% 确定我完全理解你的意思。我可以添加更详尽的描述,但我想让事情尽可能简单,并使问题更广泛。也许我没有很好地解释自己,但我想我的问题是:“在 QT 内部有一个指针(将被编辑,如它所指向的类中的值将被更改)是否安全容器(在这种情况下,我主要使用 QHash 和 QMap,虽然也将使用 QList)。我确保指针在仍在使用时不会被删除。
-
@ymoreau 是的,当引用仍在使用时,我永远不会删除对象。我想我的问题是,在 QMap、QHash、任何数据结构、何时编辑该元素时,是否绝对安全。例如。拥有 ClassB *element 并执行 element->add(ClassC) (或对该指针的任何其他更改)是否安全?我将更改问题以使其更清楚。