在stacoverflow中有许多答案表明,由于非静态局部变量在函数退出后被销毁,因此不会返回指向它们的指针。
我真心相信这一点。
直到我遇到以下代码(代码末尾):
一个函数(test1
)创建一个本地int
并通过&
返回指向它的指针。
当在main中调用它时,这将导致SIGSEGV
正常,因为函数退出后指针变得悬空了。(我假设那是segmentation fault
-这里的初学者)
一个函数(test2
)创建一个本地int
,并使用int *
将其地址存储在&
中,然后返回此指针var。在主中调用可以访问int值!
注意:这非常相似,尽管与出色的解释here不同。首先,其中的代码确实有效,例如test1
,会产生分隔错误(g ++ 7.4.0)。但更重要的是,test2
表明,一旦丢失的值通过指针var返回并且不是直接使用{{1}与return
内联,它总是可以访问丢失的值}。我知道那不应该有所作为,但这是唯一的区别。除非可以给出显式的计数器,否则在函数退出后,内存只是简单地保留在局部值上,而我只是很幸运,这一事实在这里并没有得到解决。
在这一点上,我感到困惑,因为错误的理解是&
返回后,本地int和int *都将被破坏。 那是错误的,我相信,因为main仍在使用int *。但是仍然,由于基础对象(本地int)被破坏了,指针怎么仍然显示其值呢?
很好,由于某些奇怪的原因,指针 vars 在函数退出后仍显示其值。
但是然后
test2
为什么失败?它创建一个本地test3
,并将其标识符返回为char[]
。与第一个char *
中的test2
一样,这是一个指针var。得到char
。
就像在SIGSEGV
创建test4
之前一样,将其分配给char[]
,然后返回此指针var。一切正常!
(char *
(失败),test5
(通过)将以上内容扩展到test6
,结果相同)
const char*
也很奇怪,尽管尽管指针未在test7
中使用而被销毁,但它的值-实际分配的位置是生活函数退出后?不在堆栈上,因为它从未分配给main
var(仅在函数退出时销毁,但在这种情况下指针var至少有一些相似之处可以作为借口),并且绝对不在堆上因为没有const char[]
。
要清楚,为什么测试的行为方式与他们相同?
在c ++中成为初学者是一个诅咒-如果只有一个人是 intermediate 出生的。无论如何,尽管我还没有从头到尾阅读它,但在 C ++完全参考4e 中找不到适合的解释。
代码
new
一如既往,我们将不胜感激任何帮助。