功能返回时的Qt分段故障

时间:2011-11-29 18:09:33

标签: c++ qt

我有一个返回迭代器的函数,我将迭代器保存在其中。 这是返回迭代器的函数(其中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

我不明白为什么这个简单的功能让系统停止。我重启了,因为有人说这是因为你有内存泄漏。但这仍然无法解决。

3 个答案:

答案 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超出范围后调用它。