将本地声明的对象存储在全局QList中是否安全?

时间:2011-04-19 07:51:31

标签: c++ qt memory-management

我有一个CPP程序,我在其中创建一个本地对象A,并希望将其存储在全局对象B中,这是一个QList。

是静态分配对象A还是需要使用 new 关键字。 QList是否使用复制构造函数?

由于

4 个答案:

答案 0 :(得分:4)

QList存储对象的副本,因此它应该可以工作。但请确保复制确实是您想要的。如果不是这种情况,请使用new分配对象并将指针存储在QList中。

答案 1 :(得分:0)

没有。内部范围变量不应存储在外部范围的变量中。您可以存储值,但不能存储该变量的引用/指针。

答案 2 :(得分:0)

QList只有一个指向它内容的指针。因此,无论何时制作QList的副本,它实际上并不复制所有内容,它只是复制指针。无论何时修改列表,都会进行复制以确保它不会修改其他对象的内容。请参阅:http://doc.qt.nokia.com/4.7-snapshot/qshareddatapointer.html

QList确实使用了复制构造函数,因此如果你的对象包含大量数据,那么在QList中使用直接对象可能并不好,因为当列表需要增长时,复制会导致一些开销。

另一个解决方案是使用QSharedDataPointer创建类似于QList的功能。

请注意,大多数Qt类已经使用了它,所以如果你的类包含这里列出的东西:http://doc.qt.nokia.com/4.7-snapshot/implicit-sharing.html使用QSharedDataPointer有点不必要。

我认为有一件事你没有明确表示有相关性。您是否希望全局静态对象A与列表中的对象具有相同的数据?

这可以通过使用指针或QExplicitlySharedDataPointer来实现。

QExplicitlySharedDataPointer与QSharedDataPointer非常相似,只有一个例外。 它在修改时不会复制数据。这是一些文档http://doc.qt.nokia.com/4.7-snapshot/qexplicitlyshareddatapointer.html

我经常使用这些类,我发现它们非常有用,并且根本不用。

答案 3 :(得分:-2)

没了。 QList存储指向对象的指针列表,因此不应将局部变量存储在全局QList中。

查看此链接了解详情:

http://twl.pl/jtz/Inne/QT-Tutorial/qlist.html#details