Question about pointers and objects?
想知道,如果我静态创建一个具有指针作为数据成员的对象,然后该对象超出范围,那么指针会发生什么?
楚马
- 在您的情况下,"静态创建"是什么意思?您认为"超出范围"一词有什么含义?
-
我编辑了我接受的答案,您可能希望再次查看它。
指针什么都没有发生,只是不存在了。如果它指向需要释放的内容,则只会导致内存泄漏。
将代码添加到用于正确清理指针的析构函数中,或使用自动清理后的"智能指针"。
编辑:如果您实际上是在创建静态对象,则通过在函数内使用static关键字进行声明,则答案是不同的。静态对象一旦由声明该函数的函数的第一次执行构成,便会继续存在,直到程序结束。其数据成员(包括指针)将保持有效。随后对该函数的调用将访问相同的对象。如果对象已分配了任何内存,除非有明确删除它,否则它将保持分配状态。
- (因为它在另一个响应下引发了一些讨论:)在这里,可能没有任何价值,尽管在日常C语言中,"走出范围"常常[误]用来表示"死,结束了它"。生命","超出范围"的正式含义与"不再存在"无关。马克显然是从前一种意义上解释了这个术语,很可能OP也做了同样的事情。因此,马克的答案在该假定的解释范围内为"正确"。从形式上讲,通常情况下,当对象超出范围时,它们不会停止存在并且不会调用其析构函数。
-
虽然可以在词法范围之外执行,但是(除了线程之外)不可能在动态范围之外执行。对于大多数C语言而言,我不确定"超出范围"是否有很好的用途,但这并不意味着将定义变量的块留在其中。
-
@David Thornley:再一次,每次离开该块时,在块内定义的静态变量都会超出范围。这不会使其"不再存在"。另外," scope "的概念在语言的某些重要功能(例如名称查找)的定义中被大量使用。我想说,提倡如此重要的术语的错误定义不是一件好事。用简单的话说,在C中,"超出范围"表示"对于不合格的名称查找不可见"。
-
我当时假设"静态创建"是用词不当,而他实际上的意思是"本地创建"。现在,我再考虑一下,我意识到他可以在函数内声明一个静态对象-当然,它会有完全不同的答案。
-
不,不是使用静态创建的。我不知道有什么其他方式可以说不是使用new关键字创建的。
指针将与对象的其余部分一起破坏。它指向的对象根本不受任何影响(除非对象的析构函数对其执行任何操作)。
修改后的答案
变量的两个属性在这里是相关的-作用域和生存期-我认为问题是将两者混为一谈。
在所有我能想到的上下文中,静态分配的对象的生命周期本质上是进程的生命周期。关于确切何时初始化(构造)对象的确切时间,有一些技术细节,但最终结果基本上是相同的-在处理过程中存在静态分配的对象。
但是,当控制线程在程序中的函数之间移动时,对象可能会进入范围,也可能超出范围。对象的范围是按名称可见的位置。如果将指向它(或对其的引用)的指针传递给其他函数,则该函数可能在其他位置可访问,否则该函数将不在范围之内。
由于静态分配的对象的生命周期为程序的持续时间,因此该对象的指针成员不会更改,因为该对象超出了范围。对象继续保持不变,并且指针成员继续指向同一位置。显然,如果静态分配的对象中的指针指向具有自动持续时间的变量,并且指向该变量的变量由于被销毁而不再存在,则静态分配的对象中的指针指向无效位置。
但是,关键是静态分配的对象没有更改,指针成员也没有更改,但是范围发生了变化。并且没有因范围的变化而引起的泄漏。
原始答案
在我能想到的所有情况下,静态分配的对象都不会超出范围,这在定义上几乎是可以的。我想如果加载了共享库然后又卸载了共享库,则静态分配的对象可能会"超出范围",但是否则...
如果这个前提是正确的,那么问题的后半部分很容易。您可以采用以下两种视图之一:
由于静态对象永远不会超出范围,因此静态对象及其指针成员不会发生任何事情,并且当对象返回范围时,它将指向同一位置-此处的范围表示"进入可以访问以下内容的函数"静态对象"。
当控制线程离开可以访问静态对象的作用域时,该静态对象及其指针成员没有任何反应,并且当该对象下一次返回作用域时,它将指向同一位置。
基本上是说两次相同的话。如果我第三次说过,那将自动是真的,不是吗?因此,静态分配的对象不会超出范围(即使不是始终可以从当前函数访问该对象),因此指针成员也不会发生任何事情。那里...我说的是这样。我想!
我想念什么?"静态创建的对象"是否具有我没有想到的含义?
-
显然您误解了"范围"的概念。 C中的范围是在其中可见已声明实体名称的区域。"超出范围"并不意味着C中的"死亡"。差远了。例如,每次函数返回时,在函数中声明的静态对象都超出范围。但是,它不会死。下次输入该功能时,您会看到相同的对象仍然处于活动状态。似乎OP也误解了有关"范围"或"静态"的某些内容。我不知道...
-
@安德烈:我的表达不尽如人意-你在说的是我想说的-我曾经(现在仍然)对答案感到困惑,"什么都没有发生如果它指向需要释放的内容,则只会出现内存泄漏。""",该泄漏当前被选择为"最佳"。"停止存在"和"泄漏"部分与我对正在发生的事情的理解是对立的。
-
当然同意AndreyT。另请参阅stackoverflow.com/questions/1388685/…