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

3 回答 3

2

此代码似乎要擦除列表。话虽如此..

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

mylist->clear();

还是我错过了什么?

于 2012-09-28T04:52:54.993 回答
0

永远不要重新发明轮子...

void B::remove()
{
    mylist.clear();
}
于 2012-09-28T04:51:16.360 回答
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; }

不过,如果你为我写了那个程序,我会很不高兴。

  • 它违反了三原则。
  • new是一个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; }
于 2012-09-28T05:07:51.193 回答