user-0 提问: 指针生命周期问题，为什么main函数在调用twoSum后，在twoSum中数组的地址可以返回给main，不是应该被释放么？

回复:
user: user-1
content: 引用 4 楼 xian0-666 的回复:你没搞清楚问题所在，只知道销毁，函数完成后，所指向的内存空间也随之被释放掉，所以函数终止意味着局部变量的引用将指向不再有效的内存区域，但是如果函数的局部变量作返回值时，会生成一个局部变量的拷贝用作返回值，之后局部变量会被系统回收，所以函数不能返回局部变量的地址，因为系统回收后，如果还返回局部变量的地址的话，指针所指向的内容毫无意义。  如：int a = 100; int *p = &a; cout << "p的地址= " << p << endl; return p; 这样访问地址是不正确的，危险的，因为已经释放掉了，但是因为可能这个区域还没来得及被其他使用覆盖，所以有可能还能访问以前的值，但是这种使用是错误的。 static char p[] = "this is test0\n";    return p; char *p = "this is test1\n";    return p;  要是这两种，test0保存在静态存储区，test1保存在只读常量区，不在通常所说的栈内存中，所以返回这个地址不会被回收，会正常返回原来的值。  总结：在主函数调用子函数时，首先程序会跳转到子函数的地址处，在子函数执行到最后return返回值时，系统会把需要返回的值存入寄存器中，然后经过“}”，子函数正式结束，在这个过程中，如果子函数有形参和局部变量，系统会为它们分配栈内存空间，等到函数运行完毕后，系统将会自动释放在栈内存中给局部变量分配的内存中的数据。所以说单纯的返回值不会有问题，但是如果要返回地址就会有问题。 至于释放，释放又不会把里面的值给修改了，那也太花精力了，只是那个值是不可控的，可能已经被修改了而已 顶，说的很棒

user: user-2
content: 返回给main是一个地址，但是这个地址已经没有意义了，因为数组在函数调用完就结束了，自动释放了。函数栈twoSum都释放了。

user: user-3
content: 栈中的变量通常包括函数参数和函数里声明的临时变量。 栈中的基本变量退出其作用域时，没有谁执行一段代码去释放/销毁/析构它所占用的内存，仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。 而栈中的类变量退出其作用域时，会自动执行其析构函数，……

user: user-3
content: 其实电脑开机后物理内存的每个字节中都有值且都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-4
content: 你没搞清楚问题所在，只知道销毁，函数完成后，所指向的内存空间也随之被释放掉，所以函数终止意味着局部变量的引用将指向不再有效的内存区域，但是如果函数的局部变量作返回值时，会生成一个局部变量的拷贝用作返回值，之后局部变量会被系统回收，所以函数不能返回局部变量的地址，因为系统回收后，如果还返回局部变量的地址的话，指针所指向的内容毫无意义。  如：int a = 100; int *p = &a; cout << "p的地址= " << p << endl; return p; 这样访问地址是不正确的，危险的，因为已经释放掉了，但是因为可能这个区域还没来得及被其他使用覆盖，所以有可能还能访问以前的值，但是这种使用是错误的。 static char p[] = "this is test0\n";    return p; char *p = "this is test1\n";    return p;  要是这两种，test0保存在静态存储区，test1保存在只读常量区，不在通常所说的栈内存中，所以返回这个地址不会被回收，会正常返回原来的值。  总结：在主函数调用子函数时，首先程序会跳转到子函数的地址处，在子函数执行到最后return返回值时，系统会把需要返回的值存入寄存器中，然后经过“}”，子函数正式结束，在这个过程中，如果子函数有形参和局部变量，系统会为它们分配栈内存空间，等到函数运行完毕后，系统将会自动释放在栈内存中给局部变量分配的内存中的数据。所以说单纯的返回值不会有问题，但是如果要返回地址就会有问题。 至于释放，释放又不会把里面的值给修改了，那也太花精力了，只是那个值是不可控的，可能已经被修改了而已

user: user-5
content: 你的理解是不准确的，如果你知道局部变量在栈里面，如果你自己了解什么是栈并实现过栈这样的数据结构。 那么，因为局部变量在栈中，向函数中传递参数直接push ,销毁数据呢，只要pop.局部变量的定义呢，只要把栈顶指针移动位置，就可以了 这些说的是基本技术背景。如果你了解这一些。 那么，push pop做了什么呢，push 不过是把数据复制到栈中，并把栈往上移动一个位置（实际x86机器，栈是往下走的，栈底在高位，压栈则是把栈顶指针向下移动），pop呢其实除了把栈顶指针（sp寄存器）加1外什么都不做。仔细想一下就应该知道。清空栈的操作就是把栈顶指针指向栈底。就可以。那么原来在内存中的数据，该在哪里还在哪里。不过是它们在栈顶指针的下部，如果再一次调用函数，把那个内存的单元直接拿过来用就是了。

user: user-0
content: 引用 1 楼 真相重于对错的回复:你认为怎么才算销毁？ main函数访问返回的地址，访问不到值。

user: user-0
content: 引用 4 楼 xian0-666的回复:你没搞清楚问题所在，只知道销毁，函数完成后，所指向的内存空间也随之被释放掉，所以函数终止意味着局部变量的引用将指向不再有效的内存区域，但是如果函数的局部变量作返回值时，会生成一个局部变量的拷贝用作返回值，之后局部变量会被系统回收，所以函数不能返回局部变量的地址，因为系统回收后，如果还返回局部变量的地址的话，指针所指向的内容毫无意义。  如：int a = 100; int *p = &a; cout << "p的地址= " << p << endl; return p; 这样访问地址是不正确的，危险的，因为已经释放掉了，但是因为可能这个区域还没来得及被其他使用覆盖，所以有可能还能访问以前的值，但是这种使用是错误的。 static char p[] = "this is test0\n";    return p; char *p = "this is test1\n";    return p;  要是这两种，test0保存在静态存储区，test1保存在只读常量区，不在通常所说的栈内存中，所以返回这个地址不会被回收，会正常返回原来的值。  总结：在主函数调用子函数时，首先程序会跳转到子函数的地址处，在子函数执行到最后return返回值时，系统会把需要返回的值存入寄存器中，然后经过“}”，子函数正式结束，在这个过程中，如果子函数有形参和局部变量，系统会为它们分配栈内存空间，等到函数运行完毕后，系统将会自动释放在栈内存中给局部变量分配的内存中的数据。所以说单纯的返回值不会有问题，但是如果要返回地址就会有问题。 至于释放，释放又不会把里面的值给修改了，那也太花精力了，只是那个值是不可控的，可能已经被修改了而已 get 到点了

user: user-6
content: 诚然，返回一个地址，然后马上销毁该地址上的对象，有些吃饱了撑的，但仅此而已。 显示一个地址就是显示一个数字而已，只有你企图通过该地址访问已销毁对象时，后果才是未定义的。

user: user-5
content: 你认为怎么才算销毁？