我有一个返回迭代器的函数,我将迭代器保存在其中。
这是返回迭代器的函数(其中building
是枚举):
vector<building>::iterator it;
for (it = building.begin(); it != building.end(); ++it)
{
if(it->getType() == type)
return it;
}
return gebouwen.end();
现在当我it->isBusy();
Qt崩溃并发出分段错误时。
isBusy
功能是:
bool isBusy( void) const { return busy ; };
当我调试Qt中的调试器时,停在该行代码处并给出:
The inferior stopped because it received a signal from the operating system. Signal name: SIGSEGV Signal meaning: Segmentation fault
我不明白为什么这个简单的功能让系统停止。我重启了,因为有人说这是因为你有内存泄漏。但这仍然无法解决。
答案 0 :(得分:3)
很可能是由isBusy ()
返回的“end”迭代器引用的对象上调用gebouwen.end()
方法导致崩溃。没有与该特殊迭代器关联的对象,因此触发了未定义的行为。您必须将该函数返回的迭代器与gebouwen.end()
进行比较,以确保找到您的对象。
此外,在C ++中将void
C ++作为参数列表没有任何意义。在C中,void foo()
和void foo (void)
之间存在差异 - 第一个意味着foo
可以接受任何参数,而第二个意味着它不能接受任何参数。但这并不代表C ++中的任何内容,因此没有必要再输入4个字符时没有意义。
答案 1 :(得分:2)
您正在返回本地向量的迭代器。迭代器被复制,但向量在返回后被销毁。所以它崩溃了。
相反,您可能希望返回迭代器当前指向的项目:*it
。
答案 2 :(得分:0)
你的代码真的是:
vector<building>::iterator foo( vector<building> & gebouwen, Type type )
{
vector<building>::iterator it;
for (it = gebouwen.begin(); it != gebouwen.end(); ++it) {
if(it->getType() == type)
return it;
}
return it;
}
然后Vlad或Tamas的回答都适用。您可以调用gebouwen.end() - &gt; isBusy()来导致SIGSEGV。或者在gebouwen超出范围后调用它。