malloc(): corrupted top size в конструкторе

Рейтинг: 0Ответов: 1Опубликовано: 30.05.2023

Вот такой вот конструктор класса world, все замечательно работает, если num_countries < 5, если же >=, то возникает ошибка при попытке выделить память на пятой итерации цикла for для toler_matrix[i].

world::world(int t, int c, std::string filename1, std::string filename2, double* rts)
{
num_takts = t;
num_countries = c;
std::ofstream output1(filename1);
std::ofstream output2(filename2);
toler_matrix = new double*[num_countries];
desire_matrix = new double*[num_countries];
throughput_matrix = new double*[num_countries];
flow_matrix = new double*[num_countries];
countries.reserve(num_countries);
for (int i = 0; i < num_countries; i++){
    toler_matrix[i] = new double[num_countries];
    desire_matrix[i] = new double[num_countries];
    throughput_matrix[i] = new double[num_countries];
    flow_matrix[i] = new double[num_countries];
    countries.emplace_back(i, c, rts[i]);
}
UpdateEveryMatrix();
SaveInformation(output1, output2, 0);
for (int i = 0; i < num_takts; i++){
    std::cout << "TAKT" << i << std::endl;
    Migration();
    for (int i = 0; i < num_countries; i++){
        countries[i].StepForward();
    }
    UpdateEveryMatrix();
    SaveInformation(output1, output2, i + 1);
output1.close();
output2.close();
}

Вот так класс выглядит

class world
{
private:
std::vector <country> countries;
double** toler_matrix; //матрица толерантности
double** desire_matrix; //матрица желания жить в стране
double** throughput_matrix; //матрица пропускных способностей
double** flow_matrix; //матрица потоков
int num_takts;  //число тактов
int num_countries; //число стран
void Migration();
void UpdateEveryMatrix();
void SaveInformation(std::ofstream & file1, std::ofstream & file2, int x);
public:
world(int num_countries, int num_takts, std::string filename1, std::string filename2, double* rts);
~world();
};

Ответы

▲ 0

Ошибка corrupted top size вылетает потому что твой код где-то вышел из массива погулять. И пытается присвоить значение к неопределенной части памяти, или writelock памяти. Размеры num_countries тут не причем, просто в мелких масштабах баг не влетает защищеную область, по факту он есть но не вызывает падение.