我真的很难确定为什么这个程序会出现段错误。我正在使用一个 std::list 包含 object 中的 objects 指针Park
。一切似乎都很好,但是当我使用列表的迭代器并尝试调用一些对象方法时,它会出现段错误。
我发现如果我修改std:list<Felid*>
to的类型std:list<Felid*>*
,就没有更多的段错误了。我想了解为什么这是有效的?
我用 g++ 编译它:g++ -g -Wall -std=c++11 main.cpp
main.cpp
:
#include <iostream>
#include <list>
class Felid {
public:
void do_meow() {
this->meow(); // <-- Segfault occurs, why ?
}
protected:
virtual void meow() = 0;
};
class Park {
public:
std::list<Felid*> getFelids() {
return this->felids;
}
void add_felid(Felid* f) {
this->getFelids().push_back(f);
}
void listen_to_felids() {
for (std::list<Felid*>::iterator it = this->getFelids().begin(); it != this->getFelids().end(); it++)
{
(*it)->do_meow(); // <-- will Segfault
}
}
protected:
std::list<Felid*> felids;
};
class Cat : public Felid {
protected:
void meow() { std::cout << "Meowing like a regular cat! meow!\n"; }
};
class Tiger : public Felid {
protected:
void meow() { std::cout << "Meowing like a tiger! MREOWWW!\n"; }
};
int main() {
Park* p = new Park();
Cat* cat = new Cat();
Tiger* tiger = new Tiger();
p->add_felid(cat);
p->add_felid(tiger);
p->listen_to_felids(); // <-- will Segfault
}