指针-在c++中返回局部引用
Pointer - returning Local reference in C++
我不确定这个问题之前是否有人问过(通过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。
- 什么时候在C++中返回常量引用是个好主意
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 是否可以跨 dll 边界返回常量引用/指向 std::vectors?
- 将成员函数的返回类型引用到C++中的自定义类
- 普通的右值引用和 std::forward 返回的引用有什么区别?
- 返回一个引用C++中另一个类对象的对象的有效方法
- C++ std::map 的返回值引用
- 矢量返回常量引用,不可能向下转换
- 为什么要返回通过引用传递给 C++ 函数的对象?
- 使用常量函数返回常量引用时出现奇怪的行为
- 如何将返回的引用封装到指向C_string的指针
- 在这种情况下,为什么使用 *此必需的对象引用返回对象引用
- 三元运算符为C++中返回的引用创建临时
- 地址运算符是否返回变量引用的对象的地址
- 返回一个C++引用变量 VS 返回一个变量
- 为什么我的C 函数拒绝返回const引用
- 有没有办法重写一个返回指向 istringstream 的指针的函数,而不是返回一个引用?
- 为什么返回非引用类型的函数表达式被认为是prvalues而不是xvalues
- 获取对函数返回的引用的指针
- 有没有办法在函数以编程方式返回的引用上多次调用函数? -元组动态访问