0

我对 C++ 中的面向对象编程、指针使用和分配内存非常陌生。我正在为班级做作业,最初我通过数组grade_array 让它通过了下面列出的前三个测试,在addScore 函数中它看起来像grade_array[count -1] =grade。然后它将用于均值函数。

我知道这不是解决此问题的正确方法,因为我遇到了段错误,所以我知道我需要一个数组,然后创建一个分配更多内存的新数组(大小的两倍),以便我可以放置值将第一个放入新的,然后删除以免内存泄漏。我遇到的真正问题是我不知道我这样做的方式是否接近正确。我得到的错误:

 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

我看到很多人有类似的问题,并在这个网站上发布了这些问题,我似乎无法解决我的问题。我看到可能是我创建了一个新指针并试图让它们指向同一个东西,所以当一个删除另一个时没有什么可删除的,或者我的初始化程序错误,因为它没有做太多。就像我说的,这个话题很新,如果我有一百万个问题和这么多错误,我很抱歉。我已经在这方面花了很多时间,希望在浪费更多时间之前能得到一些建议,在此先感谢!

成绩簿.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

成绩簿.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);
}

成绩簿测试.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
4

1 回答 1

0

我认为以下是错误的

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

你不需要这个 for 循环,因为你只为grad_array. 一个delete grade_array;就够了。

于 2013-10-08T02:33:14.520 回答