繁体   English   中英

函数返回时的Qt分段错误

[英]Qt segmentation fault on function return

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

我不明白为什么这个简单的功能会使系统停止运行。 我已经重新启动,因为有人说这是因为您内存泄漏。 但这仍然无法解决。

这是最有可能的崩溃是通过调用引起isBusy ()的“结束”所引用的对象上的方法迭代器返回的gebouwen.end() 没有与该特殊迭代器关联的对象,因此触发了未定义的行为。 您必须将该函数返回的迭代器与gebouwen.end()进行比较,以确保找到了您的对象。

同样,在C ++中将void C ++作为参数列表没有任何意义。 在C语言中, void foo()void foo (void)之间有区别-第一个含义是foo可以接受任何参数,而第二个含义则是它不能接受任何参数。 但这在C ++中没有任何意义,因此当您无缘无故又要输入4个字符时没有任何意义。

您正在返回局部向量的迭代器。 迭代器被复制,但是向量在返回后被销毁。 所以它崩溃了。

相反,您可能想要返回迭代器当前指向的项目: *it

您的代码是否真的是:

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()-> isBusy(),这会导致SIGSEGV。 或在gebouwen超出范围后再打电话。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM