クラスへのポインターのベクトルがあります。デストラクタを呼び出してメモリを解放する必要があります。それらはポインターのベクトルであるため、 vector.clear() は仕事をしません.だから私は手動でそれをやり続けました:
void Population::clearPool(std::vector<Chromosome*> a,int size)
{
Chromosome* c;
for(int j = 0 ;j < size-1;j++)
{
c = a.back();
a.pop_back();
delete c;
printf(" %d \n\r",j);
c = NULL;
}
}
そこにあるprintfは、どの染色体でセグメンテーション違反が発生したかを確認するための話しているデストラクタがあるためです。clearPool() が呼び出され、サイズが 100 になったと言うと、0 から 100 までの任意の染色体でセグメンテーション違反が発生する可能性があります。
なぜこれが起こっているのか分かりませんし、実際に何が悪いのかを見つける方法もありません。なぜなら、ブレークポイントを使ってデバッグしている間、ランダムな染色体で起こっているだけだからです。
コードブロック IDE と gdb デバッガーを使用しています。セグメンテーション違反が発生したときのスタック トレースには、4 つのメモリ アドレスと関数がありますwsncpy()
。