Ошибка векторной сегментации C ++ при доступе к первому элементу

Мне было очень тяжело с этой ошибкой, так как я старался изо всех сил, чтобы исправить ее, но безрезультатно.

Я строю генетический алгоритм для своего класса C ++, и мне нужно хранить множество отдельных лиц в каком-либо контейнере, поэтому я решил создать собственный класс-контейнер под названием «GenePool» для хранения экземпляров «IndividualPtr» (который является умный указатель typedef на «Individual»).

Эти индивидуумы хранятся в его внутреннем векторе, и я перегрузил оператор индекса ([]) для доступа к его элементам.

Однако моя программа едва запускается, потому что после заполнения вектора элементами она всегда вызывает ошибку сегментации при попытке получить доступ к элементу 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 вы должны добавить else для случая ошибки, когда это не LangermannPoint или CurveParams. Кажется, проблема не в этом, но вы должны добавить, что в этом вам поможет.

Во-вторых, в operator [] (int index), прежде чем получить доступ к элементу, убедитесь, что запрошенный индекс не выведет вас за пределы допустимого диапазона. Вы можете проверить это по сравнению с IndividualList.size ().

Также вызовите size (), чтобы увидеть, есть ли у вас элементы в списке.

1

Другие решения

Итак, получается, что настоящая причина, почему я продолжал получать эту ошибку, была из-за глупой ошибки с моей стороны: я забыл инициализировать размер популяции, поэтому он никогда не добавлял элементы в вектор, когда я думал, что это произошло.

Но, к счастью, я узнал все об ошибках сегментации благодаря изучению этой ошибки и тому, как сделать вектор абстрактных типов данных 🙂

0

По вопросам рекламы [email protected]