Вектор как закрытый член класса, определенного с помощью указателя: нет ошибки, но странное поведение - PullRequest
1 голос
/ 29 сентября 2019

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

Hello world! Процесс вернул -1073741819 (0xC0000005) время выполнения: 1,665 с Нажмите любую клавишу для продолжения.

Я определил listInt как вектор в приватном элементе. Это происходит от указателя, который я использую для определения объекта Class1?

    #include "Class1.h"
    using namespace std;

    Class1::Class1()
    {
        int age(10);
        listInt[0]=age;
        cout <<"address Vector1: "<<&listInt[0] << " -  value1:"<<listInt[0] <<  endl;

    }
    Class1::~Class1()
    {
        //delete listInt;
    }
    void Class1::ClassPrintOut() const
    {

    cout << listInt[0] <<  endl;

    }

Class1.cpp

    #ifndef CLASS1_H_INCLUDED
    #define CLASS1_H_INCLUDED
    #include <vector>
    #include <iostream>

    class Class1
    {
        public:
    Class1();
    ~Class1();
    void ClassPrintOut() const;


        private:
    std::vector<int> listInt;


    };
    #endif

Main.cpp

    #include <iostream>
    #include "Class1.h"
    using namespace std;


    int main()
    {
        cout << "Hello world!" << endl;
        Class1 *test(0);
    test =new Class1();
    test->ClassPrintOut();

    delete test;
    return 0;

    }

1 Ответ

5 голосов
/ 29 сентября 2019

Вы явно не инициализировали своего std::vector<int> listInt участника. Это означает, что будет использован конструктор по умолчанию std::vector<int>. Инициализирует вектор с начальным размером 0 , поэтому доступ к нему с индексом 0 недопустим.

Чтобы задать начальный размер для вашего списка, вы должны сделать:

Class1::Class1() : listInt(/* the initial size */) { ... }

Это дает вам вектор с размером /* the initial size */ и всеми элементами, инициализированными в ноль.

Если вы хотите изменить размер путем динамического добавления элементов, используйте push_back или emplace_back:

listInt.push_back(/* element to add */);
listInt.emplace_back(/* element to add */);

Оба добавляют элемент в конец вектора и увеличивают размер вектора на единицу.

Разница в том, что emplace_back создает новый элемент на месте, используя переданные ему параметры, но push_back всегда копирует (или перемещает) элемент. В вашем случае (std::vector<int>) они не имеют значения.

...