我得到了一個CPP程序,我製作了一個本地對象A並希望將其存儲在全局對象B中,這是一個QList。在全局QList中存儲本地聲明對象是否安全?
它是保存到靜態分配對象A還是我需要使用新的關鍵字。 QList是否使用複製構造函數?
謝謝
我得到了一個CPP程序,我製作了一個本地對象A並希望將其存儲在全局對象B中,這是一個QList。在全局QList中存儲本地聲明對象是否安全?
它是保存到靜態分配對象A還是我需要使用新的關鍵字。 QList是否使用複製構造函數?
謝謝
QList存儲對象的副本,所以它應該工作。但是確保複製的確是你想要的。如果不是這種情況,請用new
分配對象並將指針存儲在QList中。
nope。 QList存儲指向對象的指針列表,所以局部變量不應該存儲在全局QList中。
退房此鏈接的詳細信息:
這是非常過時的。 QList與今天的QList完全不同。這是Qt4中的當前QList:http://doc.qt.nokia.com/latest/qlist.html。 QList 存儲A對象的副本,A對象的QList 指針。在這種情況下,推薦並安全地存儲可能的副本。 – 2011-04-19 08:16:32
號範圍內的變量不應該被存儲在外部範圍的變量。您可以存儲這些值,但不能存儲該變量的引用/指針。
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
我使用這些類很多,我發現它們非常有用,並不難用。
- >是否安全。 – Viet 2011-04-20 06:06:00