ошибка сегментации с использованием виртуального метода в C ++ - PullRequest
3 голосов
/ 18 октября 2010

Я получил объектно-ориентированную программу C ++, которая работала правильно. Я решил изменить его, добавив некоторые полиморфизмы, определяющие иерархию классов с виртуальными методами. Когда я вызываю виртуальный метод, он вызывает ошибку сегментации ошибки, вероятно, потому что у меня есть мусор в объекте.

Это звонок и разогрев

  GPUAntColony *colony; // Base class
  GPUAntColonyConfiguration config;
  set_config(config);
  set_initial_pheromone(problem, config);
  colony = (GPUAntColony *)new GPUSimpleAntColony(problem, config);//inhereted class
  colony->run(); //Virtual method

Теперь позвольте мне показать вам базовый класс

 class GPUAntColony {

 private:

    void reset_ants() {
    for(unsigned int i=0; i<configuration_.number_of_ants;i++) {
         ants_[i]= Util::random_number(problem_->number_of_vertices());
    }
  }

  void initialize_Pheromone(){
   for(unsigned int i=0; i<problem_->number_of_vertices()*problem_->number_of_vertices();i++) {
       pheromones_[i]=(float)configuration_.initial_pheromone;
   }
  }


   protected:
  float * pheromones_;
    float alpha_;
    float beta_;
  unsigned int iterations;
    GPUAntColonyConfiguration::LocalSearchType local_search_type_;
  GPUAntColonyConfiguration configuration_;
  unsigned int * ants_;
    GPUOptimizationProblem *problem_;

  public:  


 ///Class Constructor for the Class GPU Ant Colony        
 GPUAntColony(GPUOptimizationProblem *problem, const GPUAntColonyConfiguration &config){

   iterations=4096; 
      problem_ = problem; // Including distance array
   configuration_ = config;
   ants_= (unsigned int*) malloc(config.number_of_ants*sizeof(unsigned int));   
      pheromones_ = (float *) malloc(problem->number_of_vertices()*problem->number_of_vertices()*sizeof(float)); 
   alpha_ = config.alpha;
   std::cout << "alpha_ " << alpha_ << std::endl;
      beta_ = config.beta;
      local_search_type_ = config.local_search;
 }

  virtual void run();  

  virtual ~GPUAntColony() {
      delete problem_;
      free(ants_);
      free (pheromones_);
    };


};

Определение дочернего класса

class GPUSimpleAntColony : public GPUAntColony{
public:
    GPUSimpleAntColony(GPUOptimizationProblem *problem, const GPUAntColonyConfiguration &config);
    void run();
};

И, наконец, реализация такого метода

void GPUAntColony::run(){ 
  reset_ants();
  initialize_Pheromone();  
}


GPUSimpleAntColony::GPUSimpleAntColony(GPUOptimizationProblem *problem, const GPUAntColonyConfiguration &config):GPUAntColony(problem, config) {
}



void GPUSimpleAntColony::run() {
 GPUAntColony::run();
  antColonyGPULauncher(configuration_.number_of_ants, problem_->number_of_vertices(), problem_->get_distances(), pheromones_,ants_,alpha_, beta_,
             configuration_.evaporation_rate, iterations, 0, 0, 0, 0, ACO_SIMPLE);
}

Надеюсь, вы сможете мне помочь.

Большое спасибо заранее.

Ответы [ 3 ]

1 голос
/ 18 октября 2010

Я заметил, что вы выделяете память с помощью malloc без проверки возвращаемого значения.Есть ли шанс, что вы получите NULL?Особенно с pheromones_, который, по-видимому, требует n * n пробела, а ваш пример кода не дает нам значение n.

1 голос
/ 18 октября 2010

Спасибо всем, друзья, но это было абсолютно глупо, как всегда.У меня была статическая переменная, которая влияла на выполнение.Сейчас работает отлично,

Спасибо большое

ура

0 голосов
/ 18 октября 2010

В базовом классе сделайте run чисто виртуальным или предоставьте для него реализацию по умолчанию.

virtual void run() = 0;

В дочернем классе объявите run virtual.

virtual void run();

РЕДАКТИРОВАТЬ: реальная проблема заключается в том, что базовый класс run () не является чисто виртуальным. Как упомянуто в комментариях ниже, дочерний класс run () автоматически станет виртуальным, но я думаю, что еще яснее явно объявить его как таковой.

Сравнить http://codepad.org/6MlrH5Q4 с http://codepad.org/lBWaEefT

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...