Я очень новичок в объектно-ориентированном программировании, использовании указателя и распределении памяти в 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
Я видел много людей, которые сталкиваются с подобными проблемами и публикуют о них на этом самом сайте. Я просто не могу исправить свою проблему. Я видел, что это может быть так, что я сделал новый указатель и попытался им указать, что они указывают на одно и то же, поэтому, когда один удаляет другого, ему нечего удалять или что мой инициализатор ошибочен, поскольку он мало что делает. Как я уже сказал, очень новая тема очень жаль, если у меня есть миллион вопросов и столько ошибок. Я потратил много времени на это уже и надеялся, что смогу, может быть, получить совет, прежде чем тратить больше времени, спасибо заранее!
#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
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];
}
Это не нужно для цикла, поскольку вы выделяете память только для grad_array
. Один delete grade_array;
достаточно.