C+返回局部变量的引用

C+返回局部变量的引用

如果必须返回i,下面的代码(function 1()正确吗?我记得在某个地方读到当返回对局部变量的引用时会出现问题。它与函数2()有什么不同?

int& func1(){
    int i;
    i = 1;
    return i;}int* func2(){
    int* p;
    p = new int;
    *p = 1;
    return p;}


弑天下
浏览 683回答 3
3回答

临摹微笑

局部变量是堆栈上的内存,当超出作用域时,内存不会自动失效。从更深层次的嵌套函数(内存中堆栈的更高部分)来看,访问这个内存是完全安全的。但是,一旦函数返回并结束,事情就变得危险了。通常,当您返回时,内存不会被删除或覆盖,这意味着内存仍然包含您的数据-指针看起来是有效的。直到另一个函数构建堆栈并覆盖它。这就是为什么这可以工作一段时间-然后突然停止功能后,一个特别深嵌套的函数集,或一个非常大的或许多本地对象的函数,再次到达堆栈内存。甚至可能发生的情况是,您再次到达同一个程序部件,并用新函数变量覆盖旧的局部函数变量。所有这一切都是非常危险的,应该非常气馁。不要使用指向本地对象的指针!

江户川乱折腾

值得记住的是这些简单的规则,它们同时适用于参数和返回类型.。Value-复制所涉项目。指针-指有关项目的地址。引用-字面上是所讨论的项目。每个人都有时间和地点,所以一定要了解他们。正如您在这里所展示的,局部变量仅限于它们在函数作用域中在本地存在的时间。在您的示例中,返回类型为int*回归&i同样也是不正确的。如果那样的话你做这个会更好.。void func1(int& oValue){     oValue = 1;}这样做将直接更改传入的参数的值。而这个密码.。void func1(int oValue){     oValue = 1;}不会的。它只会改变oValue函数调用的本地。之所以这样做,是因为您实际上只需要更改一个“本地”副本。oValue,而不是oValue本身。
打开App,查看更多内容
随时随地看视频慕课网APP