#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:
В вашем классе есть несколько ошибок:
- Я не вижу ничего, что он предоставляет, что
std::vector<ParticlePtr>
также не предоставляет (правильно). - Вы не указали оператор присваивания и, таким образом, нарушили правило 3.
- Ваш конструктор копирования неверен и не инициализирует ни одного из ваших членов.
- Ваш
get
метод реализует индексацию на основе 1, что, скорее всего, всех смутит.
Очень вероятно, что проблема 2 или 3 выше является основной причиной вашего сбоя.
Но проблемы 1 должно быть достаточно, чтобы выбросить этот код и заменить его на std::vector
.
Комментарии:
1. о, нам не разрешено использовать STL такие вещи, как векторы