分段故障 !!!!!帮我

时间:2013-08-24 20:29:06

标签: c++ boost segmentation-fault

我正在使用boost线程在C ++中创建一个程序,其中Hilo类包含一个Thread,它负责更新类的相应属性......我的问题是我尝试“Agregar hilo” (添加Hilo)我得到一个分段错误,我已经尝试了一切,没有找到原因? 这是完整的代码可以帮助我(PDTA:我的工作Centos模式控制台)

//file: Hilo.h    
#ifndef HILO_H   
#define HILO_H1    
#include <boost/thread.hpp>   
#include <boost/date_time.hpp>    
#include <string>    
using namespace std;    
class Hilo{    
private:    
    int id;    
    string mensaje;    
    int tiempo_vida;    
    boost::thread hilo;    
public: void accion();    
        Hilo(int,int);    
        ~Hilo();    
        void setId(int);    
        int getId() const;    
        void setTiempoVida(int);    
        int getTiempoVida() const;    
        string getMensaje() const;    
};//endif    

//file: Hilo.cpp    
#include "Hilo.h"    
#include <iostream>
Hilo::Hilo(int id,int tiempo_vida){    
    this->id=id;    
    this->tiempo_vida=tiempo_vida;    
    this->hilo=boost::thread(&Hilo::accion,this);}    
Hilo::~Hilo(){}    
void Hilo::accion(){    
    unsigned a=1;    
    boost::posix_time::seconds velocidad_(a);    
    while (this->tiempo_vida>=0){    
        stringstream sstm;    
        sstm<<"Hilo numero:"<<this->id <<" tiempo de vida restante:"<<(this->tiempo_vida--);    
        this->mensaje=sstm.str();    
        boost::this_thread::sleep(velocidad_);}    
}    
void Hilo::setId(int id){    
    this->id=id;}    
int Hilo::getId() const{    
    return this->id;}    
void Hilo::setTiempoVida(int tiempo_vida){    
    this->tiempo_vida=tiempo_vida;}    
int Hilo::getTiempoVida() const{   
    return this->tiempo_vida;}    
string Hilo::getMensaje() const{    
    return this->mensaje;}    

//file: Operaciones.h   
#ifndef OPERACIONES_H    
#define OPERACIONES_H1    
#include "Hilo.h"    
class Operaciones{    
private:    
    int contadorHilos;    
public:    
    Operaciones();    
    void agregarHilo(int);    
    void verHilo(int);    
};#endif    

    //file: Operaciones.cpp    
#include "Operaciones.h"    
    Operaciones::Operaciones(){    
        this->contadorHilos=0;}    
void Operaciones::agregarHilo(int tiempo_vida){    
    Hilo hil(this->contadorHilos,tiempo_vida);    
    this->contadorHilos++;    
}    
void Operaciones::verHilo(int hilo){} //en construccion    

//file: Principal.cpp    
#include <iostream>    
#include <cstdlib>    
#include "Operaciones.h"    
using namespace std;    

int main(){    
    bool run=true;    
    int opcion;    
    Operaciones oper;    
    system("clear");    
    while(run==true){    
        cout<<"APLICACION MULTI-HILO\nDigite alguna de las opciones\n1. Crear nuevo hilo\n2.Observar hilo\n3. Salir\n";    
        cin>>opcion;    
        switch(opcion){    
        case 1:    
            system("clear");    
            cout<<"Se va a crear un nuevo hilo\n";    
            cout<<"Digite el tiempo de vida del hilo(segundos)";    
            int tiempo;    
            cin>>tiempo;    
            oper.agregarHilo(tiempo);    
            cout<<"Se ha agregado correctamente";    
            break;    
        case 2:    
            system("clear");    
            cout<<"Se va a observar un hilo\n";    
            break;    
        case 3:    
            system("clear");    
            cout<<"Fin del programa, gracias\n";    
            run=false;   
            break;    
        default:    
            system("clear");    
            cout<<"La opcion que ingreso es incorrecta\n";    
            break;    
        }    
        sleep (1.1);    
        system("clear");    
    }    
    return 0;    
}    

1 个答案:

答案 0 :(得分:1)

当您调用agregarHilo时,会构造一个Hilo对象来启动一个线程。

agregarHilo立即返回时,该对象将被销毁,当线程尝试访问它时,它将访问被销毁的对象。

您需要确保Hilo对象超过线程,可能是通过在某个集合Operaciones实例中跟踪它们,如std::vector