Проблема с поиском причины (ов) ошибки сегментации

#c #segmentation-fault #g

#c #ошибка сегментации #g

Вопрос:

Код продолжает выдавать ошибку ошибки сегментации (выпадение ядра)

Я чувствую, что что-то не так с getNumberParticles() ; так как, когда я просто возвращаю 0 в качестве определения функции, ошибки нет, но если я возвращаю что-либо еще, кроме 0, возникает ошибка

также, если вы скажете мне использовать gdb, это программа с несколькими файлами с одним основным, я не уверен, как ее так отладить

particleList.cpp

 
    ParticleList::ParticleList() {
    numParticles = 0;
    particles[500] = {};
    }

//  ParticleList::ParticleList(int rows, int cols){
//  numParticles = 0;
//  particles[rows * cols * 4] = {};
//  } 

    ParticleList::ParticleList(const ParticleListamp; obj){

    }
    // Clean-up the particle list
    ParticleList::~ParticleList() {
        for(int i = 0 ; i < 500 ; i  ){
            delete particles[i];
    }
    }

    // Number of particles in the ParticleList
    int ParticleList::getNumberParticles() {
        numParticles = 0;
        for(int i = 0 ; i < 500 ; i  ){

            if(particles[i] != nullptr){
                numParticles  ;
            }
     }
       return this->numParticles;
    }

    // Get a pointer to the i-th particle in the list
    ParticlePtr ParticleList::get(int i) {
       return particles[i-1];
    }

    // Add a particle (as a pointer) to the list
    //    This class now has control over the pointer
    //    And should delete the pointer if the particle is removed from the list
    void ParticleList::add_back(ParticlePtr particle) {
        int quantity = getNumberParticles();
        particles[quantity]= particle;
    }

    // Remove all particles from the list
    void ParticleList::clear() {
        for(int i = 0 ; i < 500 ; i  ){
            particles[i]= nullptr;
        }
    }
  

ParticleList.h

 
#ifndef COSC_ASS_ONE_PARTICLE_LIST
#define COSC_ASS_ONE_PARTICLE_LIST

#include "Particle.h"
#include "Types.h"

class ParticleList {
public:

   /*                                           */
   /* DO NOT MOFIFY ANY CODE IN THIS SECTION    */
   /*                                           */


   // Create a New Empty List
   ParticleList();

   ParticleList(const ParticleListamp; obj); //Copy Construcor

   // Clean-up the particle list
   ~ParticleList();

   // Number of particles in the ParticleList
   int getNumberParticles();

   // Get a pointer to the i-th particle in the list
   ParticlePtr get(int i);

   // Add a particle (as a pointer) to the list
   //    This class now has control over the pointer
   //    And should delete the pointer if the particle is removed from the list
   void add_back(ParticlePtr particle);

   // Remove all particles from the list
   // Don't forget to clean-up the memory!
   void clear();

   /*                                           */
   /* YOU MAY ADD YOUR MODIFICATIONS HERE       */
   /*                                           */
   ParticleList(int rows, int cols);
   /* This is a suggestion of what you could use. */
   /* You can change this code.                   */
private:

    // particle* particles[300] 
    //Array of pointers to particle objects
   ParticlePtr    particles[500];
   int           numParticles;



};
  

Комментарии:

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

2. Ваш getNumberParticle выглядит нормально, но ваш get вычитается на единицу, поэтому я предполагаю, что у вас где-то есть какая-то отдельная ошибка.

3. прежде всего, в вашем конструкторе particles [500] находится за пределами вашего массива. И если вы хотите установить для него значение null, используйте memset .

4. В вашем конструкторе вы устанавливаете particles[500] = {} , но particles значение изменяется только от 0 до 499.

5. particles[500] = {}; не инициализирует ваш массив нулем; это присваивание, и из-за синтаксической особенности оно эквивалентно particles[500] = 0; .

Ответ №1:

В вашем классе есть несколько ошибок:

  1. Я не вижу ничего, что он предоставляет, что std::vector<ParticlePtr> также не предоставляет (правильно).
  2. Вы не указали оператор присваивания и, таким образом, нарушили правило 3.
  3. Ваш конструктор копирования неверен и не инициализирует ни одного из ваших членов.
  4. Ваш get метод реализует индексацию на основе 1, что, скорее всего, всех смутит.

Очень вероятно, что проблема 2 или 3 выше является основной причиной вашего сбоя.

Но проблемы 1 должно быть достаточно, чтобы выбросить этот код и заменить его на std::vector .

Комментарии:

1. о, нам не разрешено использовать STL такие вещи, как векторы