我对下面的代码有两个问题
Posted
技术标签:
【中文标题】我对下面的代码有两个问题【英文标题】:I have two questions about the code below 【发布时间】:2013-03-17 18:16:08 【问题描述】:在 VS2010 中运行此代码,我收到如下所示的警告,但控制台上会输出 C 字符串“f()”和“g()”。
问题 1:为什么 f() 会生成警告而 g() 不会?在程序结束之前,字符串文字不是一直保存在静态内存中吗?
问题 2:当我在 main() 中注释掉对 h() 的调用时,代码会崩溃。为什么会有不同的行为?
#include<iostream>
const char* const& f()
return "f()"; // warning C4172: returning address of local variable or temporary
const char* g()
return "g()"; // no warning
const std::string& h()
return "h()"; // warning C4172:
int main()
std::cout << f() << '\n';
std::cout << g() << '\n';
// std::cout << h().c_str() << '\n'; // comment out and program crashes
【问题讨论】:
【参考方案1】:您将 reference 返回到仅在本地使用的值。这是未定义的行为。您可能想要的只是返回一个字符指针或std::string
,而不是字符指针引用或std::string&
。
您碰巧看到打印出来的f()
只是抽奖的运气。它仍然是未定义的行为,不能指望。
【讨论】:
【参考方案2】:f() 产生未定义的行为。未定义的行为会使您的程序处于无效状态,从而导致(伪随机)崩溃。
这是未定义的行为,因为您返回对局部变量的引用。函数调用后,局部变量将被销毁,让您的char*
指向无处,真的。
如果您删除引用,则该值将被复制,并且我们不存在范围冲突。
【讨论】:
After the function call the local variable will be destroyed, leaving your char* pointing to nowhere
但是字符串文字不会一直存活到程序结束吗?
@user1042389 字面量仍然存在,但指向它的指针已被销毁。
@Xymotech 您的意思是与引用关联的指针(可能)?
是的。内存中某处有一个字符串文字,您的函数创建一个指向它的 char 指针并返回对它的引用,但是当函数返回时指针本身被销毁。所以引用指向随机内存(碰巧它指向的可能有你想要的值,但也可能没有)。
@Xymotech 但是为什么 VS2010 总是在 f() 中返回一个有效地址?因此,您所说的可能是其他编译器可能会以不同的方式执行此操作。是这个主意吗?以上是关于我对下面的代码有两个问题的主要内容,如果未能解决你的问题,请参考以下文章