Почему вектор объектов класса удаляет объекты при добавлении объектов с помощью push_back - PullRequest
0 голосов
/ 07 мая 2019

Когда я спрашиваю, почему вектор удаляет объекты, я не имею в виду механику того, что делает вектор, когда его емкость превышена путем добавления к нему элементов.Я знаю, что как только вектор достигает емкости, первоначально выделенная память удаляется, а затем выделяется новая большая память, чтобы вместить увеличенное количество элементов.Для вектора объектов класса это означает, что будут вызываться деструкторы.

Что мне интересно, так это то, почему именно при попытке доступа к членам моего класса я получаю ошибку «ошибка чтения символов строки» после превышенияемкость моего вектора объекта класса с помощью push_back ().

Я попытался изменить push_back на emplace_back (), но это не помогло.Я заставил его работать, объявив вектор определенного размера и используя at () для присвоения значений, но с этого момента я даже использую вектор для начала?

#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <utility>
#include "Book.h"
using namespace std;

int main () {
    string holder[5]; //used to hold strings from file.
    int temp; //Used to hold number from file.
    ifstream infile;

    vector<pair<Book, int>> bookInfo;

    infile.open(bookDatabase.txt)
    //i < 8 because the vector needs to start off holding 8 book objects.
    for (int i = 0; i < 8; i++) {
        //Second for loop designed based on specific format of the file.
        for (int j = 0; j < 5; j++) 
            getline(infile, holder[j]);
        infile >> temp;
        infile.ignore() //ignore newline;

        //Call class constructor for 5 string inputs.
        Book tempBook(holder[0], holder[1], holder[2], holder[3], holder[4]);

        //Here is where, in the debugger, I see that the string members of my 
        //book class all read "error reading characters of string"
        bookInfo.push_back(make_pair(tempBook, temp));

        //Read in empty line that separates information from book to book. 
        string tempString;
        getline(infile, tempString);
    }
    infile.close();

    return 0;
}


Объект My Book имеет толькостроковые члены и основные функции получения и установки, а также функция, которая печатает основную информацию книги.Он не имеет членов-указателей и отлично работает.

Я также уверен, что создание пар и ввод файла выполняется правильно.

Мне интересно, почему я теряюмоя книга возражает, когда я превышаю векторную емкость.Мне разрешено создавать вектор объектов класса, так почему же нет механизма для сохранения содержимого объектов, когда вектор должен перемещаться в большую память при превышении емкости?Или я что-то не так делаю?

1 Ответ

0 голосов
/ 07 мая 2019

Я понял это, и я опубликую свои результаты ради потомков.Я извиняюсь перед замечательными душами, которые пытались помочь мне не публиковать код в классе книги, но я только сейчас попал в положение, где я мог бы опубликовать код.

Я не уверен, что стало причиной моегопрограмма, чтобы испортить в другом месте, но моя проблема вектора была только меня, смущенного.Отладчик действовал странно с моей точки зрения, поэтому я предположил, что что-то не так, но «ошибка чтения символов из строки» была из старой памяти, которая была удалена.Члены были успешно скопированы в объект __that (не уверен, что объект прав), и после повторной обработки мои векторы работали точно так, как и предполагалось.

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