[英]Appending pointers to QList
我需要將類的指針(從QObject繼承)插入到QList中。 我知道可以使用以下語法:
。H
QList<MyObject*> list;
的.cpp
list.append(new MyObject("first", 1));
list.append(new MyObject("second", 2));
...
然后釋放內存:
if(!list.isEmpty())
{
qDeleteAll(list);
list.clear();
}
這應該是有效的,不會導致任何內存泄漏(據我所知)。 但是,我需要在將對象添加到集合之前初始化對象。 以下代碼段是否會導致內存泄漏或懸空指針等錯誤(我將使用相同的方法刪除上面的指針)?
MyObject *obj;
for(i = 0; i < 5; i++)
{
obj = new MyObject();
if(!obj.Init(i, map.values(i)))
{
// handle error
}
else
{
list.append(obj);
}
}
謝謝。
如果你在“// handle error”的情況下處理“obj”(已分配但未初始化的實例),你的代碼就可以了。
請改用QSharedPointer。
QList<QSharedPointer<MyObject> > list;
要釋放記憶,你只需要做
if(!list.isEmpty())
{
list.clear();
}
要附加到列表中
list.append(QSharedPointer<MyObject>(new MyObject("first", 1)));
list.append(QSharedPointer<MyObject>(new MyObject("second", 2)));
使用RAII(資源分配是初始化)。 直接在構造函數中初始化對象。
然后代碼看起來像:
for(i = 0; i < 5; i++)
{
list.append( new MyObject( i, map.values(i)));
// In case of initialization failure, throw exception from the constructor
}
你可以使用QScopedPointer ..
從Qt 4.6文檔中,
QScopedPointer類存儲指向動態分配的對象的指針,並在銷毀時刪除它。 手動管理堆分配的對象很難並且容易出錯,常見的結果是代碼泄漏內存並且難以維護。 QScopedPointer是一個小型實用程序類,它通過將基於堆棧的內存所有權分配給堆分配來大大簡化了這一過程,通常稱為資源獲取是初始化(RAII) 。
希望能幫助到你..
編輯:
例如,
你會用的,
QScopedPointer<QWidget> p(new QWidget());
代替
QWidget *p = new QWidget();
並將QScopedPointer
添加到您的QList
而不必擔心內存泄漏和懸空指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.