-1

このエラーは本当に苦労しています。最初の要素にアクセスするとC++のベクトルセグメンテーションエラーが発生する

私は自分のC++クラスの遺伝的アルゴリズムを構築しています。何人かのコンテナに多くの個体を格納しなければならないので、 "GenePool"というカスタムコンテナクラスを作成して "IndivPtr "(これは"個人 "へのtypedefスマートポインタです)。

これらの個体は内部ベクトルに格納されており、その要素にアクセスするために添字演算子([])をオーバーロードしました。

しかし、要素でベクトルを埋め込んだ後は、ベクトルからFIRST要素にアクセスしようとするとセグメント化エラーが発生し、std :: out_of_range例外がスローされるため、プログラムがほとんど実行されません。

私は、このようなエラーを引き起こすことなくベクトルから要素にアクセスする方法を知りたいと思います。ここで

はGenePoolのコードです:

#include "GenePool.h" 
#include "Controller.h" 
#include <algorithm> 

GenePool::GenePool() 
{ 
    // Default empty constructor 
    individualList.reserve(10000); 
} 

GenePool::~GenePool() 
{ 
    //deleteAll(); 
} 

void GenePool::sortPool() 
{ 
    // Sort the vector from greatest to least using GreatertThanSort 
    // The third parameter is the address of the GreaterThanSort's greater than function for a GreaterThanSort for Individuals 
    std::sort(individualList.begin(), individualList.end(), &GreaterThanSort::greaterThan); 
} 

Individual& GenePool::operator[](int index) 
{ 
    // Put exception handling here somewhere (a throw statement) 
    return *individualList.at(index); 
} 

// Get an individual from the list between index 0 and index size - 1 
Individual& GenePool::getRandIndiv() 
{ 
    return this->operator[](Controller::getRandNumInRange(0, this->size() - 1)); 
} 

void GenePool::pushBackIndiv(const IndivPtr& indiv) 
{ 
    individualList.push_back(indiv); 
} 

void GenePool::pushBackIndiv(Individual& indiv) 
{ 
    Individual * p2Indiv = &indiv; 

    if(LangermannPoint * pIndivL = dynamic_cast<LangermannPoint*>(p2Indiv)) 
    { 
     IndivPtr pL(new LangermannPoint(*pIndivL)); 
     individualList.push_back(pL); 
    } 
    else if(CurveParams * pIndivC = dynamic_cast<CurveParams*>(p2Indiv)) 
    { 
     IndivPtr pC(new CurveParams(*pIndivC)); 
     individualList.push_back(pC); 
    } 
} 

int GenePool::size() const 
{ 
    return individualList.size(); 
} 

void GenePool::clear() 
{ 
    if(!individualList.empty()) 
    { 
     individualList.clear(); 
    } 
} 

void GenePool::addContentsOf(GenePool& other) 
{ 
    for(int i = 0; i < other.size(); ++i) 
    { 
     pushBackIndiv(other[i]); 
    } 
} 

この添字はベクトルが満たされている、と呼ばれる前に:ここで

// Initialize a population of individuals with randomly generated  parameters. 
    if(getProblemType() == Controller::OPTIMIZATION) 
    { 
     for(int i = 0; i < getInitPopSize(); ++i) 
     { 
      population.pushBackIndiv(IndivPtr(new LangermannPoint(getRandFloatInRange(0.0f, LangermannPoint::POINT_BOUND), 
                    getRandFloatInRange(0.0f, LangermannPoint::POINT_BOUND)))); 
     } 
    } 
    else 
    { 
     for(int i = 0; i < getInitPopSize(); ++i) 
     { 
      population.pushBackIndiv(IndivPtr(new CurveParams(getRandFloatInRange(-CurveParams::PARAM_BOUND, CurveParams::PARAM_BOUND), 
                   getRandFloatInRange(-CurveParams::PARAM_BOUND, CurveParams::PARAM_BOUND), 
                   getRandFloatInRange(-CurveParams::PARAM_BOUND, CurveParams::PARAM_BOUND), 
                   getRandFloatInRange(-CurveParams::PARAM_BOUND, CurveParams::PARAM_BOUND)))); 
     } 
    } 

は常にクラッシュ添字演算子への呼び出しです:

bool Controller::terminationCondition() 
{ 
    population.sortPool(); 
    // After sorting, the first is the fittest 
    if(generationCount <= 1) 
    { 
     setSolution(population[0]); 
     return false; 
    } 
    else if(getSolution() < population[0] && generationCount < MAX_GEN_COUNT) 
    { 
     setSolution(population[0]); 
     return false; 
    } 
    else 
    { 
     return true; 
    } 

} 

答えて

1

まず、pushBackIndivでは、erroの場合はelseを追加する必要がありますrはLangermannPointまたはCurveParamsではありません。問題はここにはないようですが、それがあなたに役立つでしょう。

第2に、演算子[](int index)では、要素にアクセスする前に、要求されたインデックスが範囲外にならないかどうかをチェックします。これはindividualList.size()と比較して確認できます。

また、実際にリストに要素があるかどうかを確認するためにsize()を呼び出します。

+0

WOW OH!私は状況が複雑であると思った。最初にリストに追加されたイベントではなかったことが判明しました! 洞察に感謝します! – gameCoder95

+0

私は例外をキャッチし、実行時にベクトルのサイズが0であることを確認するためにサイズをチェックしました。これは、そのサイズの値を初期化していないことを意味します。 – gameCoder95

0

申し訳ありませんが、このエラーが発生し続けている本当の理由は、私の愚かな間違いのためです。人口のサイズを初期化するのを忘れてしまったので、それが起こったと思った。

しかし、ありがたいことに、私はこのエラーを調査し、どのように抽象データ型のベクトルを作ることによって、すべてのセグメンテーションエラーについて学んだ:)

関連する問題