在putty中运行make、make测试时,我得到了一个空闲但未分配的指针错误 我对C++中的面向对象编程、指针使用和内存分配都很陌生。我正在为这个类做一个作业,最初我让它通过了下面列出的前三个测试,通过了一个数组grade_array,在addScore函数中它看起来像grade_array[count-1]=grade。然后它将被用于均值函数

在putty中运行make、make测试时,我得到了一个空闲但未分配的指针错误 我对C++中的面向对象编程、指针使用和内存分配都很陌生。我正在为这个类做一个作业,最初我让它通过了下面列出的前三个测试,通过了一个数组grade_array,在addScore函数中它看起来像grade_array[count-1]=grade。然后它将被用于均值函数,c++,C++,我知道这不是解决这个问题的正确方法,因为我遇到了seg故障,所以我知道我需要一个数组,然后创建一个新数组(大小的两倍),分配更多内存,这样我可以将第一个数组的值放入新数组,然后删除以避免内存泄漏。我现在面临的真正问题是,我不知道我在做这件事的方式上是否接近正确。我得到的错误是: Running cxxtest tests (5 tests)testrunner(85436) malloc: *** error for object 0x107a87970: pointer being free

我知道这不是解决这个问题的正确方法,因为我遇到了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
我看到很多人都有类似的问题,并在这个网站上发布了关于这些问题的帖子,但我似乎无法解决我的问题。我发现可能是我做了一个新的指针,试图让它们指向同一个东西,所以当一个删除了另一个时,没有什么要删除的,或者我的初始值设定项是错误的,因为它没有太多作用。就像我说的,这个话题很新,如果我有一百万个问题和这么多错误,我很抱歉。我已经在这上面花了很多时间,希望在我浪费更多时间之前能得到一些建议,提前谢谢

成绩册
\ifndef成绩册
#定义成绩册
#包括
使用名称空间std;
班级成绩册{
公众:
成绩册();
成绩册(常量字符串和文件名);
成绩册(const成绩册和该成绩册);
虚拟~成绩册();
void initCount();
无效分数(双倍分数);
双getScoreAt(inti);
intgetcount(inti);
字符串getSourceFile();
double getMean();//更改回double
双getMin();
双getMax();
double getMedian();
双getStdDev();
int评分范围(双低、双高);
私人:
字符串文件名;
int*grade_数组;
int新尺寸;
整数计数;
整数计数跟踪器;
int*grade_点;
};
#恩迪夫
成绩册
void成绩册::initCount(){
计数=0;
}
成绩册::成绩册(){
}
成绩册::成绩册(常量字符串和文件名):文件名(文件名){
//this->filename=filename;//我相信filename(filename)会执行这一行
//grade_array=newint[this->getCount(0)+1];
}
成绩册:成绩册(const成绩册和那本){
}
成绩册::~成绩册(){
对于(inti=0;igetCount(0);i++){
删除&grade_数组[i];
}
删除grade_数组;
}
无效成绩册::添加分数(双倍成绩){
int count_tracker=this->getCount(1);//当前数组中的元素数
//grade_数组=新整数[count_tracker];
//grade_数组=新整数[1];//grade_数组只是一个*数组
grade\u数组[count\u tracker-1]=grade;//数组[0]不是数组[1]
新尺寸=计数跟踪器*2;
int*new_数组=new int[new_size];
对于(int i=0;igetCount(0);
对于(int i=0;i
成绩册测验
\ifndef成绩册\u测试\u H
#定义成绩册测试
#包括
#包括
类GradebookTest:公共CxxTest::TestSuite{
公众:
void testDefaultConstructor(){
字符串filename=“data1.txt”;
成绩册a(文件名);
TS_ASSERT_EQUALS(“data1.txt”,a.getSourceFile());
}
void testAddOne(){
成绩册gb;
gb.initCount();
国标总分(110分);
TS_ASSERT_等于(120,gb.getScoreAt(1));
TS_ASSERT_DELTA(110,gb.getMean(),0.001);
TS_断言_等于(4,gb.getCount(0));
}
void testAddMultiple(){
成绩册gb;
国标总分(75分);
TS_断言_等于(1,gb.getCount(0));
国标总分(85分);
TS_断言_等于(2,gb.getCount(0));
TS_ASSERT_DELTA(85,gb.getMean(),0.001);
}
#恩迪夫

我认为以下是错误的

for ( int i = 0; i < this->getCount(0); i ++){
    delete &grade_array[i];
}
for(inti=0;igetCount(0);i++){
删除&grade_数组[i];
}

你不需要这个for循环,因为你只为
grade\u数组
分配内存。一个
delete grade\u数组;
就足够了。

谢谢你,我认为你是对的。现在我只需要找到其他700个错误。哦,不,这不能解决问题。
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);
}
#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
for ( int i = 0; i < this->getCount(0); i ++){
    delete &grade_array[i];
}