为什么这个c ++程序会出现段错误?

时间:2014-03-29 22:52:38

标签: c++ polymorphism stdlist

我真的很难确定为什么这个程序是segfaulting。我在对象Park中使用包含对象指针的std :: list。一切似乎工作正常,但当我使用列表的迭代器并尝试调用一些对象方法时,它会段错误。

我发现如果我将std:list<Felid*>的类型修改为std:list<Felid*>*,则不会再发生段错误了。我想了解为什么会这样做?

我使用g ++编译:{{1​​}}

g++ -g -Wall -std=c++11 main.cpp

main.cpp

3 个答案:

答案 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}}第一个列表并继续通过随机存储器。

此外,您重复执行的列表只是暂时的,所以当您尝试使用迭代器时它已经消失了。