Невозможно удалить содержимое динамического массива в C ++ - PullRequest
0 голосов
/ 07 февраля 2019

Я бьюсь головой об этом некоторое время.В деконструкторе моего класса у меня есть цикл for, который должен перебирать массив объектов и удалять их.Хотя, когда я пытаюсь, я получаю нарушение прав чтения.Прикрепленный код должен считывать информацию из двух документов и использовать ее для создания объектов Country.

#include "pch.h"
#include "CountryCatalogue.h"
#include "Country.h"
#include <iterator>
#include <map>
//imports for reading the files
#include <iostream>
#include <fstream>

CountryCatalogue::CountryCatalogue()
{
    _maxSize = 10;
    _curSize = 0;
    _catalogue = new Country*[_maxSize];
}

CountryCatalogue::CountryCatalogue(std::string continentFileName, std::string countryFileName)
{

//block that opens the files and checks to make sure they can be read
//open up the files
std::ifstream inFile1;
std::ifstream inFile2;

//opening both text files and ensuring that the file is readable to the program
inFile1.open(continentFileName);
if (!inFile1) {
    std::cout << "Unable to open file";
    exit(1); // terminate with error
}

inFile2.open(countryFileName);
if (!inFile2) {
    std::cout << "Unable to open file";
    exit(1); // terminate with error
}

// read the continet file
// while there is still stuff to read in the file
std::string str;

while (!inFile1.eof())
{
    std::string Country, Cont;

    //reading lines from file and assigning to variables
    std::getline(inFile1, Country);
    std::getline(inFile1, Cont);

    //mapping to variables read from file
    _countryContinent.insert(std::pair<std::string, std::string>(Country, Cont));
    _curSize++;
}

//closing file after use
inFile1.close();

//creating array
_catalogue = new Country*[_curSize+2];

//resetting size to zero for later itteration
_curSize = 0;

// read the country file
// while there is still stuff to read in the file
while (!inFile2.eof())
{
    std::string name, POP, AREA;
    int pop;
    double area = 0.0;

    std::getline(inFile2, name);
    std::getline(inFile2, POP);
    std::getline(inFile2, AREA);

    if (!POP.empty() && POP[POP.length() - 1] == '\n') {
        POP.erase(POP.length() - 1);
    }
    if (!AREA.empty() && AREA[AREA.length() - 1] == '\n') {
        AREA.erase(AREA.length() - 1);
    }

    pop = std::stoi(POP);
    area = std::stod(AREA);

    //creating iterator to search through mapped values
    std::map<std::string, std::string>::iterator it;
    it = _countryContinent.find(name);

    //creating empty string variable to store continent
    std::string cont;

    //using value found by iterator to make continent string
    //ensuring value isn't the end valueof the map
    if (it != _countryContinent.end()){
        cont = it->second;
    }

    //std::cout << name << pop << area << cont << std::endl;

    // add the country to the catalogue
    addCountry(name, pop, area, cont);

    }
}

CountryCatalogue::~CountryCatalogue() {

    /*for (int i = 0; i < _curSize; i++){
        delete _catalogue[i];
        std::cout << "deleted" << i << std::endl;
    }*/
    delete[] _catalogue;
}

void CountryCatalogue::addCountry(std::string name, int pop, double area,     std::string cont) {

    //std::cout << name << pop << area << cont << std::endl;
    //std::cout << _curSize << std::endl;

    Country* toAdd = new Country(name, pop, area, cont);
    if (_curSize == _maxSize) {
        expandCapacity();
    }

    //adding country object to array
    _catalogue[_curSize] = toAdd;

    //adding to _curSize for next iteration
    _curSize++;
}


void CountryCatalogue::printCountryCatalogue() {

    std::string s;


    /*for (int i = 0; i < _curSize; i++) {
        s += _catalogue[i]->to_string() + "\n";
    }*/ 

    std::cout << _curSize << std::endl;
}

void CountryCatalogue::expandCapacity() {

    //doubling array size
    _maxSize = _maxSize * 2;

    //creating pointer to new array of new size
    Country** newCatalogue = new Country*[_maxSize];

    //copying old array into new
    for (int i = 0; i < _curSize; i++) {
        newCatalogue[i] = _catalogue[i];
    }

    //deleting old array
    delete[] _catalogue;

    //making _catalogue point to newCatalogue
    _catalogue = newCatalogue;
}

ОБНОВЛЕНИЕ: что мой код должен делать, это получать информацию из текстовых файлов и создавать объекты, используя эти данные.Я обязан использовать массив вместо вектора.Код работает нормально, и я могу создать объект страны.Проблема в том, что я не могу добавить созданный объект в массив _catalogue, так как не могу удалить его потом.Когда я пытаюсь выполнить итерацию по массиву, я получаю сообщение о том, что обнаружено повреждение кучи.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Ваша проблема связана с этой строкой

_catalogue = new Country*[_curSize+2];

во втором конструкторе.Вы забыли обновить _maxSize, поэтому у вас есть несоответствие между _maxSize и реальным выделенным объемом памяти.

Попробуйте:

_maxSize = _curSize+2;
_catalogue = new Country*[_maxSize];
0 голосов
/ 07 февраля 2019

Вы создали _catalogue как динамический массив.

Чтобы освободить память, выделенную для массивов элементов с использованием new TYPE[SIZE], синтаксис:

delete[] _catalogue; 

Необходим цикл для удаленияпамять, выделенная для элементов Matrix.Например

int matrix = new int[rows][cols];
for (int i = 0; i < rows; ++i)
    delete [] matrix[i];   

Массив удаляется строка за строкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...