這個程序不段錯誤,它的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; }
首先,mylist似乎是未初始化的。請發佈一個完整的,最小的示例程序來演示問題。請參閱http://ssccee.org獲取更多信息。 –