gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 00:31:30 25 4
gpt4 key购买 nike

我真的很难确定为什么这个程序会出现段错误。我在对象 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com