我正在尝试一些东西,我制作了这段代码: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*
的代码的第一个版本时发现的相同问题。所以它似乎与指针有关。
答案 0 :(得分:0)
在编译时使用-Wall
选项以获得适当的警告,例如:
gcc program.c -o program -Wall
否则,这个问题及其接受的答案解释了为什么会发生这种情况,甚至提供类似于你观察的例子:
如果您好奇,请检查汇编程序输出!您可以通过以下方式生成它:
gcc program.c -S
由于行为是未定义的,任何事情都可能发生,您遇到的很可能是由函数内部引起的,编译器在通常用于返回的寄存器中保留了正确的值。