作为指针定义的类的私有成员的向量:没有错误但奇怪的行为

1 c++ private vector

我不明白为什么以下代码不起作用:没有错误,它只是向我发送以下结果:

你好,世界!返回的过程-1073741819(0xC0000005)执行时间:1.656 s按任意键继续。

我将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;

    }
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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;

    }
Run Code Online (Sandbox Code Playgroud)

Kae*_*Rin 5

您没有显式初始化您的std::vector<int> listInt成员。这意味着std::vector<int>将使用默认构造函数。它将初始化初始大小为0的向量,因此使用索引访问它0无效。

要给列表增加初始大小,您应该执行以下操作:

Class1::Class1() : listInt(/* the initial size */) { ... }
Run Code Online (Sandbox Code Playgroud)

这为您提供了一个大小为的向量,/* the initial size */并且所有元素都初始化为零。

如果要通过动态添加元素来更改大小,请使用push_backemplace_back

listInt.push_back(/* element to add */);
listInt.emplace_back(/* element to add */);
Run Code Online (Sandbox Code Playgroud)

两者都在向量的末尾附加一个元素,并将向量的大小增加一个。

区别在于,emplace_back使用传递给它的参数就地构造新元素,但push_back始终复制(或移动)该元素。在您的情况下(std::vector<int>),它们没有区别。