指针-在c++中返回局部引用

Pointer - returning Local reference in C++

本文关键字:返回局 引用 c++ 指针      更新时间:2023-10-16

我不确定这个问题之前是否有人问过(通过SOF搜索,找不到答案)

我写了一个LinkedList类和一个函数来反转它。函数如下,

    struct LinkedList::element* LinkedList::recurrsiveReverseList(element* head){
     element* tempList;
     if(head->next == NULL){
        return head;
     }else{
        tempList = recurrsiveReverseList(head->next);
        head->next->next = head;
        head->next = NULL;
        return tempList;        
    }
   }

在这里,我声明了一个局部指针变量,并对其进行了一些更改,然后将其返回给调用者。在c++中,当我在函数中声明一个局部变量时,作用域只存在于函数内部。现在当我从函数返回指针时它是如何工作的?我能够理解逻辑并得到结果(幸运的是),但我不能完全理解这里的工作。

谁能消除我的疑虑?

tempList的作用域在退出函数时终止,但tempList是指向内存块的指针,其作用域终止在那里,因为它无疑是由new分配的。以这种方式分配的内存直到您delete为止都是有效的,无论您要进入或退出多少函数。

通过将指针返回给调用者,它保留了该指针,可以在其他地方使用它。

一个简单的例子:

static char *fn (void) {
    char *rv = new char[42];
    return rv;
}
int main (void) {
    char *x = fn();
    delete [] x;
    return 0;
}

在上面的代码中,rv的作用域被限制在fn函数声明之后。

x的作用域被限制在main函数声明之后。

new分配的内存在fn中存在,返回main后继续存在。上述内存的地址,最初存储在rv中,通过将fn的返回值赋值给x,转移到x

不确定是否有人这样解释,但指针本身只不过是一个数字,就像…0 x12345678。这个数字依次指向计算机内存中的一个位置,该位置包含您正在查找的实际值,即链表节点。

所以当你返回那个地址时,原始变量被销毁是可以的。比如把街道地址抄写在另一张纸上,然后扔掉原来的纸。

指针对象 tempList在离开函数时不再存在。但这没关系;您返回的是存储在对象中的的(副本),而不是对象本身。就像

int n = 42;
return n;

(返回局部变量的地址会给您带来麻烦。)

我假设你的链表节点是在自由存储(即new)上分配的。

当你用new创建一个对象时,它是在自由存储上创建的,直到你在它上面调用delete。您可以根据需要创建任意多个指向该位置的指针,并且它独立于任何函数调用而存在。在这个函数中,你只是按值返回一个指针,指向自由存储中的那个位置。指针只是一个数字,它是对象的地址,就像按值返回int一样。

tl;dr:您显然知道您可以按值返回本地对象,因为创建了副本。在这个函数中,它返回指向自由存储空间中某个位置的指针的副本,该指针只有在使用指向该内存位置的指针调用delete时才会被销毁。

作为另一个注意事项,您可能不应该返回指向列表新头部的指针,而是通过引用获取指向列表头部的指针,并通过该指针更改列表,因此,如果有人忘记将他们的旧头部指针分配给recurrsiveReverseList返回的指针,事情不会搞砸。

tempList变量的使用范围在方法内部被限制为局部变量,但是它保存的是返回的内存地址。调用its的代码将接收这个内存地址,而不是变量tempList。