C++ 我的程序跳过返回语句

C++ 我的程序跳过返回语句,c++,g++,C++,G++,我的程序具有以下功能: vector<itemPtr> Level::getItemsAt(const Point& pt) { vector<itemPtr> vect(items.size()); // copy all items at pt's position to vect remove_copy_if(items.begin(), items.end(), vect.begin(),

我的程序具有以下功能:

    vector<itemPtr> Level::getItemsAt(const Point& pt)
    {
        vector<itemPtr> vect(items.size());
        // copy all items at pt's position to vect
        remove_copy_if(items.begin(), items.end(), vect.begin(),
                       boost::bind(matchesPosition<itemPtr>, _1, pt));

        // update LevelMap and return
        map.setHasItem(pt, false);
        return vect;
    }
我已经尝试过几次从头开始重新编译,事先删除可执行文件和所有对象文件,但它仍然这样做

奇怪的是,如果我注释掉return语句并尝试编译,它只会给出
警告:在返回non-void的函数中没有return语句。我本以为在返回某些内容的函数中不提供return语句将是一个编译器错误,但我猜不是

我意识到这并不多,但有人知道为什么会发生这种情况吗?检查什么?在这一点上,我甚至不知道从哪里开始寻找


编辑:为了澄清,我正在使用
-O0
进行编译


根据tjm的说法,我的gcc版本将仍然使用RVO,即使带有
-O0
编译器标志,所以这毕竟是问题所在。谢谢你们的帮助,伙计们。

C++源代码不必与生成的目标代码一一对应,只要行为保持不变。这里发生的是编译器重新排列代码,并可能调用

编辑: 将此添加到GCC选项中:
-fdump tree nrv
以通过编译器查看NRVO应用程序(您将获得一个扩展名为
.nrv
的文件)。这仅适用于大于
-O0
的优化级别


没有优化,用复制构造函数或复制赋值操作符调用替换<代码>返回<代码>语句仍然是C++前端转换,它不被代码> GDB <代码>优雅地处理。

< P>我可以想到返回语句可能跳过的几个原因——这些情况都可以吗?
  • 在第519行抛出异常。考虑到第521行被击中,这听起来不太可能
  • 编译器已优化了返回语句行-您是否正在调试正确的调试生成(未启用优化)

该函数工作正常吗?被调用方是否返回结果并继续它的快乐方式?

是否正确分配和初始化了map和pt对象

如果从第519行抛出异常,那么该方法将不会正常返回。在这种情况下,当堆栈展开时,您可能期望下一行“已执行”为第521行


我在Visual C++中看到了很多这类代码,当代码执行了一些导致“未定义行为”的事情。我没有足够的g++经验来知道观察到的行为是否相同。

您是否在没有优化的情况下编译(
-O0
)?如果不是,那么这可能是命名返回值优化的一个实例。我将把这一点添加到问题中。虽然我是用
-O0
编译的。@Max,我对RVO知之甚少,但如果Nikolai链接中的第一个示例是关于是否发生这种情况的有效测试,那么当我在这里编译它时,似乎gcc 4.4.4会做到这一点,即使你用
-O0
编译@tjm:有趣。因此,gcc似乎在使用RVO,而不管是否使用
-O0
。这可能回答了我的问题@尼古拉:我编译并运行了
-fdump tree nrv
,没有
-O0
,但我在任何地方都看不到.nrv文件。它到哪里去了?它应该和源文件在同一个目录下,同名。它至少需要
-O1
(无优化标志表示无优化)。生成的文件是硬读的:)一旦被调用方尝试使用函数返回的向量,我的程序就会出错。我假设这是因为我的程序试图使用一个空向量,但在函数调用后单步执行显示被调用方是一个大小正确的向量。这听起来像是对返回值的优化,但我使用的是
O0
。没有引发异常。我的程序在遍历从该函数返回的向量后,最终会出现故障。尽管这个问题似乎与跳过的return语句无关。
Breakpoint 1, yarl::level::Level::getItemsAt (this=0x80d4d58, pt=...)
at src/Level.cpp:519
519                 map.setHasItem(pt, false);
(gdb) next
521             }
(gdb)