2012-09-28 96 views
0

的名單我有兩個類如何刪除分段錯誤而刪除類指針

class A{}; 

class B{ 
Private: 
list<A*> * mylist; 
remove(); 

}; 

void B:: remove() // To remove list mylist 
{ 
    list<A*>::iterator iter = mylist->begin; 
    for(;iter!=mylist->end;) 
    { 
    list<A*>::iterator iter1 = iter++; 
    --iter; 
    delete (*iter); 
    mylist->erase(iter); 
    iter = iter1; 
    } 

} 

我得到分割故障刪除的功能,請我在哪裏做錯了指正。

+4

首先,mylist似乎是未初始化的。請發佈一個完整的,最小的示例程序來演示問題。請參閱http://ssccee.org獲取更多信息。 –

回答

2

此代碼出現擦拭名單。這就是說..

for (list<A*>::iterator it = mylist->begin(); 
    it != mylist->end(); delete *it++); 

mylist->clear(); 

還是我錯過了什麼?

+0

再次得到segmenation故障,如果我只寫'mylist-> clear();'那麼我沒有得到任何故障,但在這種情況下仍然存在內存泄漏。 – EmptyData

+0

這意味着列表中的指針或者已經被釋放或者首先被垃圾回收。我會檢查它是如何填充的,並確保每個項目仍然有效。他們在別處被刪除的機會有多少? – WhozCraig

0

決不推倒重來......

void B::remove() 
{ 
    mylist.clear(); 
} 
+0

泄漏列表中的每個動態對象。 – WhozCraig

+0

@WhozCraig,不帶智能指針:) – chris

+0

在什麼時間是A *智能指針(我完全同意它*應該是,然而= P) – WhozCraig

0

這個程序不段錯誤,它的valgrind下成功運行:

#include <list> 

class A{}; 

class B{ 
public: 
    B() { 
    mylist = new std::list<A*>; 
    mylist->push_back(new A); 
    mylist->push_back(new A); 
    } 
~B() { remove(); } 

private: 
std::list<A*> * mylist; 
void remove(); 
}; 

void B:: remove() // To remove list mylist 
{ 
    std::list<A*>::iterator iter = mylist->begin(); 
    for(;iter!=mylist->end();) 
    { 
    std::list<A*>::iterator iter1 = iter++; 
    delete (*iter1); 
    mylist->erase(iter1); 
    } 
    delete mylist; 
    mylist = 0; 
} 

int main() { B b; } 

不過,我會很苦惱,如果你寫的程序我。

  • 它違反了三條規則。
  • It new s an std::list。從不new標準容器,它只是浪費空間。
  • 它擁有令人困惑的所有權語義的裸指針。優選std::list<A>。如果你絕對需要指針,請使用std::list<std::shared_ptr<A> >
  • 它不提供異常安全。

如果你可以修改你的數據結構,這裏是我將如何編寫你的程序。請注意缺少顯式析構函數,複製構造函數和賦值運算符。 一切正常。

#include <list> 

class A{}; 

class B{ 
public: 
    B() { 
    mylist.push_back(A()); 
    mylist.push_back(A()); 
    } 

private: 
std::list<A> mylist; 
void remove(); 
}; 

void B:: remove() // To remove list mylist 
{ 
    mylist.clear(); 
} 

int main() { B b; }