作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我真的很难确定为什么这个程序会出现段错误。我在对象 Park
中使用包含对象指针的 std::list .一切似乎都工作正常但是当我使用列表的迭代器并尝试调用一些对象方法时,它会出现段错误。
我发现如果我修改 std:list<Felid*>
的类型至 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
}
最佳答案
问题出在 std::list<Felid*> getFelids()
方法。它按值返回列表,因此每次调用它时都会得到列表的一个新拷贝。您应该使用 std::list<Felid*>&
返回引用
段错误是因为您的迭代器的 begin()
和 end()
来自不同的列表(因为你每次都制作拷贝),所以迭代器永远不会到达 end()
第一个列表并继续遍历随机内存。
此外,您正在迭代的列表只是一个临时列表,因此在您尝试使用迭代器时它已经消失了。
关于c++ - 为什么这个 C++ 程序会出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22737956/
我是一名优秀的程序员,十分优秀!