我真的很难确定为什么这个程序是segfaulting。我在对象Park
中使用包含对象指针的std :: list。一切似乎工作正常,但当我使用列表的迭代器并尝试调用一些对象方法时,它会段错误。
我发现如果我将std:list<Felid*>
的类型修改为std:list<Felid*>*
,则不会再发生段错误了。我想了解为什么会这样做?
我使用g ++编译:{{1}}
g++ -g -Wall -std=c++11 main.cpp
:
main.cpp
答案 0 :(得分:1)
std::list<Felid*> getFelids()
这将返回列表的副本。对它的任何更改都不会影响您班级中的felids
。将返回类型更改为std::list<Felid*>&
答案 1 :(得分:1)
关键问题是您按下面的值返回列表而不是引用
std::list<Felid*> getFelids() {
return this->felids;
}
这里getFelids不返回std :: list的副本,并且将felids添加到不会添加到原始类成员的felids中。当您通过指针返回时,您正在修改原始类成员。
正确的方法是通过指针(std :: list&lt;&gt; *)或引用(std :: list&lt;&gt;&amp;)
返回答案 2 :(得分:1)
问题在于std::list<Felid*> getFelids()
方法。它按值返回列表,因此每次调用它时都会获得列表的新副本。您应该返回std::list<Felid*>&
段错误是因为你的迭代器begin()
和end()
来自不同的列表(因为你每次都要复制一次),所以迭代器永远不会到达{{ 1}}第一个列表并继续通过随机存储器。
此外,您重复执行的列表只是暂时的,所以当您尝试使用迭代器时它已经消失了。