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



我得到了一个CPP程序,我做了一个局部对象a,并希望将其存储在全局对象B中,这是一个QList。

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

谢谢

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

No。内部作用域变量不应该存储在外部作用域变量中。您可以存储值,但不能存储指向该变量的引用/指针。

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

我经常使用这些类,我发现它们非常有用,使用起来一点也不难。

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

查看此链接了解详细信息:

http://twl.pl/jtz/Inne/QT-Tutorial/qlist.html细节

最新更新