当我尝试发出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实现上。
答案 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;
}