STL向量包含导致段错误的向量

时间:2018-12-21 17:58:50

标签: c++

当我尝试发出push_back调用时,以下代码将导致段错误。我在做什么错了?

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main() {
    std::string * foo = new std::string("hello world");
    cout << *foo << endl;

    std::vector<std::vector<std::string *> > my_vecs;
    my_vecs[0].push_back(foo); // segfaults
    cout << "trying to print my_vecs size of " << my_vecs.size() << " but we never reach that point due to segfault " << endl;
    return 0;
}

我很确定我违反了使用vector的合同之一,因为问题肯定出在STL实现上。

2 个答案:

答案 0 :(得分:1)

当创建my_vecs时,它具有0个元素,因此my_vecs[0]不存在,并产生段错误。您必须首先保留my_vecs的至少一个元素,然后才能将指针插入向量my_vecs[0]中。

std::vector<std::vector<std::string *> > my_vecs(1);
my_vecs[0].push_back(&foo);

答案 1 :(得分:0)

必须先显式增长外部向量,然后才能推入其向量。

这可能有点令人惊讶,因为STL映射会自动插入其密钥。但是,肯定是这样。

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main() {
    const int DESIRED_VECTOR_SIZE = 1;
    std::string * foo = new std::string("hello world");
    cout << *foo << endl;

    std::vector<std::vector<std::string *> > my_vecs;

    for (int i = 0; i < DESIRED_VECTOR_SIZE; ++i) {
        std::vector<std::string *> tmp;
        my_vecs.push_back(tmp); // will invoke copy constructor, which seems unfortunate but meh
    }

    my_vecs[0].push_back(foo); // segfaults
    cout << "now able to print my_vecs size of " << my_vecs.size() << endl;
    return 0;
}