【发布时间】:2014-05-10 16:30:43
【问题描述】:
我认为这两个函数都有问题,因为它们返回指向堆栈中分配的局部变量的引用/指针:
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 上。
【问题讨论】:
-
返回对局部变量的引用是未定义的行为。返回一些指针不是。只有 取消引用 指针是。的确,没有办法合理地使用
func2()的值,但它不是那种未定义的行为。 -
在gcc.gnu.org/onlinedocs/gcc/Warning-Options.html,有一个选项(
-Wno-return-local-addr)(如果我理解正确的话)应该删除这种警告,即警告是默认启用。也许升级 gcc ?