我的Q与这些非常相似,但不完全相同:
Returning const reference to local variable from a function
Returning function-local variable as reference
我有一些用于解析xml文件的代码。 基本上发生的是使用return语句通过函数的引用OUT传递局部变量。更确切地说:
ezxml_t ezxml_parse_fd(int fd){
ezxml_root_t root;
//DO STUFF
return &root->xml;
}
来电者如下
ezxml_t xml = ezxml_parse_fd(fd);
嗯,这个东西编译和工作(gcc)...但我一直都知道局部变量一旦它们的范围不再存在就会被破坏......我很困惑
答案 0 :(得分:2)
本地变量不“通过引用传递”,因为这意味着return &root;
,这不是您的代码所说的。
相反,返回一个指向其他一些不相关的变量的指针,你不关心这些变量,我们应该假设代码被正确编写,以便指针指向一些动态分配的内存,这些内存将保留有效的。
答案 1 :(得分:1)
一旦函数返回,函数堆栈就会被解开&对函数局部变量的引用无效。你现在可以侥幸逃脱,但不要依赖它! 为什么不将输出参数传递给函数来存储值?也许,在这些方面:
void ezxml_parse_fd(int fd, ezxml_t *parse_value)
{
ezxml_root_t root;
//DO STUFF
*parse_value = &root->xml;
return;
}
...
ezxml_t xml;
ezxml_parse_fd(fd, &xml);
如果您使用gcc
,很可能会看到警告消息"警告:函数返回本地变量的地址" 请付款注意编译警告!它只是试图帮助你(大多数时候):)
希望这有帮助!
答案 2 :(得分:0)
是的,局部变量已被销毁,但您的引用指向内存中保存最后赋值的位置。放置变量的位置。对于简单类型,它在大多数情况下都适用于单线程环境。 但是当你在堆栈上使用析构函数分配一些对象时,析构函数将在块(在你的情况下 - 函数)的执行完成时被调用。因此,在函数外部,您可以引用被破坏的对象。 不久:不要这样做: - )
答案 3 :(得分:0)
在C中 - 这可能是非常错误的。 请告诉我们ezxml_t是什么以及root-> xml是什么。
我的猜测是ezxml_t会被你返回的root-> xml指针自动转换为。