Проблема заключалась в глупой ошибке другого класса при доступе к вектору и удалении итераторов. Ничего общего с кодом ниже. Извините за потраченное время.
Я должен упустить что-то элементарное. У меня есть функция, которая создает объект, манипулирует его данными, а затем помещает их в вектор. В момент выхода из функции программа вылетает с SIGSEV, и я смотрю на (Kdevelop gcc 4.5 gdb):
/**
* The dtor only erases the elements, and note that if the
* elements themselves are pointers, the pointed-to memory is
* not touched in any way. Managing the pointer is the user's
* responsibility.
*/
~vector()
{ std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
_M_get_Tp_allocator()); }
Я не храню указатели, я пытаюсь хранить созданные объекты.
void Init::initIndividual(int ID, int gen)
{
Individual temp_person = Individual(ID,gen);
int inst_size = getRandom<int>(1,max_inst_size);
for (int k=0;k<inst_size;k++)
{
retry:
// (1) randomly choose a body part
int body_num = getRandom<int>(1,20);
body_part temp_part = get_body_part(body_num);
// NOTE: We need to make sure that the body part is unique!
std::vector<Instruction> already_existing = temp_person.get_instructions();
if (already_existing.size() > 0)
{
for (int a=0; a< already_existing.size();a++)
{
std::string name = already_existing[a].get_body_part();
if ( name.compare(temp_part.name) == 0 )
{ //if body part already exists in the list, retry!
goto retry;
}
}
}
// (2) Create a new Instruction for this body part
Instruction temp_inst = Instruction(temp_part.name,temp_part.max_angle,temp_part.min_angle);
// (3) Randomly pick a number of body parameters to use
int paramsize = getRandom<int>(1,max_params_size);
// (4) Randomly choose time and degree trajectory parameters for this body part and append!
for (int x=0;x < paramsize; x++)
{
float time = 0.0f;
int choice = 0;
// (4.a) If begin of body parameters
if (x==0)
{
//if always start at time = 0
if (static_time_init)
{
time = 0.0f;
}
//if randomly choose the init time
else if (!static_time_init)
{
time = getRandom<float>(0.0f,(float)(time_constrain-1));
}
}
// (4.b) if not @ start of params
else if(x!=0)
{
redo:
float previous_time = temp_inst.parameters.back().time; //get previous time
double incrementor = getRandom<double>(0.1,1.0); //increment time by min 0.1 max 1.0
time = previous_time + (float)incrementor;
if (time > time_constrain) //if current time is more than time constrain, redo
{
goto redo;
}
}
// (5) Randomly pick a degree to move to (within body part constrains)
float degree = getRandom<float>(temp_inst.get_min_angle(),temp_inst.get_max_angle());
Parameter foo = Parameter(time,degree);
temp_inst.add_parameter(Parameter(time,degree));
}
temp_person.add_Instruction(temp_inst);
}
temp_person.endtime = time_constrain;
}
Вот и вся функция.
std::vector<Individual> population;
Разве функция push_back не копирует объект при возврате? Вызывается ли деструктор, потому что push_back пытается уничтожить temp_person ? Я не определил оператор копирования в классе Individual. Я сталкивался с этой проблемой раньше и никогда не понимал ее. Это происходит из-за того, что в конце функция temp_person выходит за рамки? Благодарю вас !
Редактировать: Индивидуальный класс
class Individual
{
friend class Population;
friend class Crossover;
friend class Init;
private:
std::string xml_file;
char *arg4;
protected:
bool saved, mutated, dead;
unsigned int UID, generation;
int executions;
std::vector<Instruction> instructions;
int father_UID, mother_UID;
double eta,endtime;
public:
int uniform;
float fitness;
pthread_mutex_t thread_mutex;
//Some other functions irrelevant
Обратите внимание, что вектор инструкций имеет еще один вектор структур.
class Instruction
{
friend class Crossover;
private:
unsigned int param_size;
float max_angle, min_angle;
bool micro_mutated;
public:
std::string body_part;
std::vector<Parameter> parameters;
//other stuff
class Parameter
{
public:
float time;
float degree;
Parameter(float t,float d);
};
Здесь нет ничего сумасшедшего.
Может ли это быть проблемой неглубокой копии, полученной с помощью pool.push_back?
Individual
правилу трех? Есть ли в нем необработанные указатели, указывающие на память кучи или другие дескрипторы ресурсов, которые освобождаются в деструкторе? - person fredoverflow   schedule 24.06.2011Individual
? В частности, содержит лиIndividual
вектор в какой-либо форме? - person dolphy   schedule 24.06.2011population
, а с уничтожениемtemp_person
, поскольку оно выходит из области действия. Что-то в вашем поколенииIndividual
небезопасно в отношении очистки. - person dolphy   schedule 24.06.2011Individual
. Конструктор класса создает его, а деструктор класса удаляет? Как вы справляетесь с копированием мьютексов? - person Nicol Bolas   schedule 24.06.2011Instruction
иParameter
(и, возможно, даже глубже), в зависимости от того, что мы найдем в вашем конструктореIndividual
. Суть такова: точно отследите, что происходит при созданииIndividual
, а затем начните работать в обратном направлении, чтобы точно увидеть, что происходит при уничтожении всего. - person dolphy   schedule 24.06.2011goto
. - person dolphy   schedule 24.06.2011goto
может иметь свое применение, но оно должно быть чрезвычайно оправдано... (больше, чем просто удобство или поверхностная производительность). Все эти причины вероятно включают в себя слова «политический» или «наследие». Вот обсуждение!. В любом случае, я рад, что вы нашли проблему. - person dolphy   schedule 24.06.2011