我认为这两个函数都有问题,因为它们返回指向堆栈中分配的局部变量的引用/指针:
int &func1() {
int a = 3;
return a;
}
int *func2() {
int a = 3;
int *p = &a;
return p;
}
但是当我使用编译命令g ++ -Wall时,为什么它只给func1而不是func2发出警告?是因为func2可以故意用于某种目的,还是可以通过添加其他参数来设置警告?我的g ++版本是4.6.3,在Ubuntu 12.04上。
答案 0 :(得分:3)
编译器无法知道您要在 func2 中返回指针的内容。
您也可以返回数组的实例,例如:
int *func2() {
int a = 3;
int *p = &a;
/*some useful stuff*/
if (some_criteria)
p = new int[10];
return p;
}
因为编译器无法评估返回指针的语义。
答案 1 :(得分:0)
根据 gcc.gnu.org/onlinedocs/gcc/Warning-Options.html 上方的 @kebs,有一个选项 (-Wno-return-local-addr) 可以执行此操作,默认情况下启用 -Wall (我查过了)。
但是,我有类似的东西
char * foo(string bar) {
return bar.c_str();
}
没有警告。但是 bar 是一个副本,因此尽管使用 -Wall 还是默默返回了一个本地值。
应该有extr &
char * foo(string &bar) {
return bar.c_str();
}
在一个几乎总能正常工作的大型程序中跟踪它浪费了数小时。