0

私は2つのクラスがあります

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

このプログラムはセグメンテーション違反ではなく、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; }

それでも、あなたが私のためにそのプログラムを書いたら、私は非常に腹を立てるでしょう。

  • 三つのルールに違反しています。
  • それnewstd::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 に答える
0

車輪の再発明は絶対にしないでください...

void B::remove()
{
    mylist.clear();
}
于 2012-09-28T04:51:16.360 に答える