2012-10-30 52 views
0

在Qt我明白,如果你創建從Qobject繼承的對象,並設置它的父,那麼家長負責刪除的孩子。我也明白,如果你在堆棧上創建對象,當它們超出範圍時它們將被刪除。刪除QStringList中Qt中

我不換我的頭周圍,我想在一個QStringList中明確刪除項目的情況下(或任何的QList),然後列表本身。

考慮一下,如果我創建了一個QStringList中,並填充它象下面這樣:在嘗試直接刪除包含在列表中的項目,然後在列表本身

QStringList multiPartPortionList; 
multiPartPortionList = multiPartPortion.split(QRegExp("[\r\n]"),QString::SkipEmptyParts); 

然後我做的東西與它調用此方法:

void MyClass::deleteList(QStringList list) { 

    // Now cleanup 
    QStringList *delList = new QStringList(list); 
    int numObjects = delList->count(); 
    for (int i=0; i < numObjects; i++) 
     delete (new QString(list.takeAt(0))); 
    delList->clear(); 
    delete delList; 
    delList = 0; 

} 

我不能叫qDeleteall(名單),因爲它需要一個指針,我也不能這樣做只是做:

delete list; 

因爲它與刪除「預計指針‘,期待一個指針’給說法」的錯誤。

我得到段錯誤有:

void MyClass::deleteList(QStringList list) { 

    // Now cleanup 
    QStringList *delList = &list; // <--- Seg fault with this 
    int numObjects = delList->count(); 
    for (int i=0; i < numObjects; i++) 
     delete (new QString(list.takeAt(0))); 
    delList->clear(); 
    delete delList; 
    delList = 0; 

} 

我也得有段錯誤:

void MyClass::deleteList(QStringList list) { 

    // Now cleanup 
    QStringList *delList = &list; 
    int numObjects = delList->count(); 
    for (int i=0; i < numObjects; i++) 
     delete &(list.takeAt(0)); // <--- Seg fault with this 
    delList->clear(); 
    delete delList; 
    delList = 0; 

} 

然後我還可以得到與分段錯誤:

void MyClass::deleteList(QStringList list) { 

    // Now cleanup 
    QStringList *delList = new QStringList(list); 
    int numObjects = delList->count(); 
    for (int i=0; i < numObjects; i++) 
     delete (new QString(list.takeAt(0))); 
    delList->clear(); 
    delete delList; 
    delList = 0; 
    delete &list; // <--- Seg fault with this 

} 

我不我認爲這是相當的,甚至是接近的,是正確的。我如何最好地實現我想要的 - 即明確刪除列表中的所有項目,然後刪除列表本身?

回答

5

QStringList list得到在函數結束自動地刪除。無需擔心在這裏刪除指針。

以同樣的方式,

QStringList *delList = new QStringList(list); 

應該

QStringList delList = QStringList(list); 

更好的是:

QStringList delList = list; 

你應該閱讀有關自動存儲和RAII。在你的代碼中,newdelete是多餘的。

要刪除列表中的一個元素,使用removeAt。這與刪除無關。

我也建議你繼續在C++之前得到good book