返回的对象没有返回关键字

时间:2018-05-08 19:44:59

标签: pointers return codeblocks

我正在尝试一些东西,我制作了这段代码:http://cpp.sh/4x435 (也在下面显示)

#include <iostream>

using namespace std;

class Thing{
    public:
        int height;
        Thing(int h): height(h) {};
        Thing(): height(10) {};
        ~Thing(){};

        int display(){ return this->height; }
};

Thing* get(){
    Thing* x = new Thing(33);
}

int main(){
    Thing* a = new Thing();
    std::cout<<"1: "<<a->display()<<std::endl;
    a = get();
    std::cout<<"2: "<<a->display()<<std::endl;
    return 0;
}

我忘记在编辑和运行之前在&#34; get&#34; -function中添加一个返回,令人惊讶的是它无论如何都正常播放(即&#34; 1:10,2:33&#34;是输出)。

现在我在shell中看到它只显示&#34; 1:10&#34;,而当我尝试让它按值返回int或字符串时,如下所示:

int get(){ int a = 30; }

int main(){
    int b = get();
    std::cout<<"1: "<<b<<std::endl;
    return 0;
}

它没有正常运行(输出&#34; 1:1&#34;),这是预期的。

那里发生了什么?不应该&#34; Things* get()&#34;故障,导致错误或至少让它在屏幕上吐出一些乱码或什么?

我使用Code :: Blocks 16.01,C ++ 11,GNU GCC编译器,没有设置额外的标志(所以只有Code :: Blocks已经设置了)

修改

它与建议的副本不完全相同,因为int get() { int a = 30; }的示例返回1,如果它返回30,则会出现同样的问题。

然而,我试过这个:

int* get(){
    int* x = new int(4);
}
int main(){
    int* a;
    a = get();
    std::cout<<"2: "<<*a<<std::endl;
    return 0;
}

在这里,我遇到了在尝试get()返回类型为Thing*的代码的第一个版本时发现的相同问题。所以它似乎与指针有关。

1 个答案:

答案 0 :(得分:0)

在编译时使用-Wall选项以获得适当的警告,例如:

gcc program.c -o program -Wall

否则,这个问题及其接受的答案解释了为什么会发生这种情况,甚至提供类似于你观察的例子:

Why does flowing off the end of a non-void function without returning a value not produce a compiler error?

如果您好奇,请检查汇编程序输出!您可以通过以下方式生成它:

gcc program.c -S

由于行为是未定义的,任何事情都可能发生,您遇到的很可能是由函数内部引起的,编译器在通常用于返回的寄存器中保留了正确的值。