Я получаю указатель, который свободен, но не выделяется ошибка при запуске make, make test in putty

0

Я очень новичок в объектно-ориентированном программировании, использовании указателя и распределении памяти в C++. Я работаю над назначением для класса, и сначала мне пришлось пройти первые три теста, перечисленных ниже, имея массив, класс_расс, который в функции addScore выглядел как class_array [count -1] = grade. Затем он будет использоваться в средней функции.

Я знаю, что это не правильный путь, потому что я получаю seg-ошибки, поэтому я знаю, что мне нужно иметь массив, а затем создать новый массив (в два раза больше), который выделяет больше памяти, чтобы я мог поместить значения первого в новый, а затем удалить, чтобы не получить утечки памяти. Реальная проблема, с которой я сталкиваюсь, - я не знаю, насколько я прав, когда я это делаю. Ошибка, которую я получаю:

 Running cxxtest tests (5 tests)testrunner(85436) malloc: *** error for object 0x107a87970: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
make: *** [test] Abort trap: 6

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

Gradebook.h

#ifndef GRADEBOOK_H
#define GRADEBOOK_H

#include <string>
using namespace std;

class Gradebook {
public:
  Gradebook();

  Gradebook(const string&  filename);

  Gradebook(const Gradebook& that);

  virtual ~Gradebook();

  void initCount();


  void addScore(double grade);

  double getScoreAt(int i);

  int getCount(int i);

  string getSourceFile();

  double getMean(); // change back to double

  double getMin();

  double getMax();

  double getMedian();

  double getStdDev();

  int scoresInRange(double low, double high);
private:
  string filename;
  int* grade_array;
  int new_size;
  int count;
  int count_tracker;
  int* grade_point;
};

#endif

Gradebook.cpp

void Gradebook::initCount(){
  count = 0;
}

Gradebook::Gradebook() {

}

Gradebook::Gradebook(const string&  filename) : filename(filename) {
  //this->filename = filename; // i beleive that filename(filename) does this line
  //grade_array = new int[this->getCount(0) +1];
}
Gradebook::Gradebook(const Gradebook& that) {

}

Gradebook::~Gradebook() {
  for ( int i = 0; i < this->getCount(0); i ++){
    delete &grade_array[i];
  }
  delete grade_array;
}

void Gradebook::addScore(double grade) {
  int count_tracker = this->getCount(1); //number of elements in array currently
  // grade_array = new int[count_tracker ];
  // grade_array = new int[1]; // grade_array is just a *array
  grade_array[count_tracker -1 ] = grade; // array[0] is first not array[1]
  new_size = count_tracker * 2;
  int* new_array = new int[new_size];
  for (int i = 0; i < count_tracker ; i++) {
    new_array[i]  = grade_array[i];
  }
  delete[] grade_array;
  grade_array = new_array;
  count_tracker = new_size;
}


double Gradebook::getScoreAt(int i) {
  return grade_array[i];
}

int Gradebook::getCount(int i) {
  if (i == 1){
    count = count + 1;
  }
    else{
      //don't want to add to the actual count
    }
  return count;
}

string Gradebook::getSourceFile() {
  //ifstream foo;

  //foo.open(filename);


  return filename;
}

double Gradebook::getMean() {
  double mean = 0;
  count_tracker = this->getCount(0);
   for (int i = 0; i < count_tracker  ; i++){
    //mean = (*(&(grade_array[i])- (bit_count))) +  mean;
     mean = grade_array[i] + mean;
   }
   return (mean/count_tracker);
}

GradebookTest.h

#ifndef GRADEBOOK_TEST_H
#define GRADEBOOK_TEST_H

#include <Gradebook.h>

#include <cxxtest/TestSuite.h>

class GradebookTest : public CxxTest::TestSuite {
public:

  void testDefaultConstructor(){
    string filename = "data1.txt";
    Gradebook a(filename);
    TS_ASSERT_EQUALS("data1.txt"  , a.getSourceFile());
  }

  void testAddOne() {
    Gradebook gb;
    gb.initCount();
    gb.addScore(110);
    TS_ASSERT_EQUALS(120, gb.getScoreAt(1));
    TS_ASSERT_DELTA(110, gb.getMean(), 0.001);
    TS_ASSERT_EQUALS(4, gb.getCount(0) );
  }

  void testAddMultiple() {
    Gradebook gb;
    gb.addScore(75);
    TS_ASSERT_EQUALS(1, gb.getCount(0) );
    gb.addScore(85);
    TS_ASSERT_EQUALS(2, gb.getCount(0));
    TS_ASSERT_DELTA(85, gb.getMean(), 0.001);
  }

#endif
Теги:

1 ответ

0

Я думаю, что следующее неверно

for ( int i = 0; i < this->getCount(0); i ++){
    delete &grade_array[i];
}

Это не нужно для цикла, поскольку вы выделяете память только для grad_array. Один delete grade_array; достаточно.

  • 0
    спасибо я думаю ты прав. Теперь мне просто нужно найти остальные 700 ошибок.
  • 0
    Если это правильный ответ, пожалуйста, отметьте его. Благодарю.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню