为什么指针对象没有被破坏?

时间:2019-05-23 09:41:40

标签: c++ function pointers return

在stacoverflow中有许多答案表明,由于非静态局部变量在函数退出后被销毁,因此不会返回指向它们的指针。

我真心相信这一点。

直到我遇到以下代码(代码末尾):

  1. 一个函数(test1)创建一个本地int并通过&返回指向它的指针。 当在main中调用它时,这将导致SIGSEGV正常,因为函数退出后指针变得悬空了。(我假设那是segmentation fault -这里的初学者)

  2. 一个函数(test2)创建一个本地int,并使用int *将其地址存储在&中,然后返回此指针var。在主中调用可以访问int值!

注意:这非常相似,尽管与出色的解释here不同。首先,其中的代码确实有效,例如test1,会产生分隔错误(g ++ 7.4.0)。但更重要的是,test2表明,一旦丢失的值通过指针var返回并且不是直接使用{{1}与return内联,它总是可以访问丢失的值}。我知道那不应该有所作为,但这是唯一的区别。除非可以给出显式的计数器,否则在函数退出后,内存只是简单地保留在局部值上,而我只是很幸运,这一事实在这里并没有得到解决。

在这一点上,我感到困惑,因为错误的理解是&返回后,本地int和int *都将被破坏。 那是错误的,我相信,因为main仍在使用int *。但是仍然,由于基础对象(本地int)被破坏了,指针怎么仍然显示其值呢?

很好,由于某些奇怪的原因,指针 vars 在函数退出后仍显示其值。
但是然后

  1. test2为什么失败?它创建一个本地test3,并将其标识符返回为char[]。与第一个char *中的test2一样,这是一个指针var。得到char

  2. 就像在SIGSEGV创建test4之前一样,将其分配给char[],然后返回此指针var。一切正常!
    char *(失败),test5(通过)将以上内容扩展到test6,结果相同)

  3. const char*也很奇怪,尽管尽管指针未在test7中使用而被销毁,但它的值-实际分配的位置是生活函数退出后?不在堆栈上,因为它从未分配给main var(仅在函数退出时销毁,但在这种情况下指针var至少有一些相似之处可以作为借口),并且绝对不在堆上因为没有const char[]

要清楚,为什么测试的行为方式与他们相同?

在c ++中成为初学者是一个诅咒-如果只有一个人是 intermediate 出生的。无论如何,尽管我还没有从头到尾阅读它,但在 C ++完全参考4e 中找不到适合的解释。

代码

new

一如既往,我们将不胜感激任何帮助。

0 个答案:

没有答案