我真的很難確定爲什麼這個程序是segfaulting。我在對象Park
中使用包含對象指針的std :: list。一切似乎工作正常,但是當我使用列表的迭代器,並嘗試調用一些對象的方法,它segfaults。爲什麼這個C++程序段錯誤?
我發現如果我將std:list<Felid*>
的類型修改爲std:list<Felid*>*
,就沒有更多的segfault。我想明白爲什麼這是行得通的?
我編譯此相剋++: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
}
當我將getFelids的返回類型更改爲'std :: list&getFelids()'時,它仍然不起作用T_T,但我現在明白了更多。 –
Nico
如果你這樣做會失敗嗎?它適用於我(不是那必然意味着很多) – Khoth
我仍然因爲某些原因得到了段錯誤=/ – Nico