关于指针和对象的问题?

时间:2009-10-16 22:28:16

标签: c++ pointers scope

只是想知道,如果我静态创建一个指针作为数据成员的对象,然后对象超出范围,指针会发生什么? Chuma的

3 个答案:

答案 0 :(得分:12)

指针根本没有发生任何事情,它就不复存在了。如果它指向需要释放的东西,那么你就会发生内存泄漏。

将代码添加到析构函数中以正确清理指针,或者使用“智能指针”自动清理它们。

编辑:如果你真的想要创建一个静态对象,通过在函数内使用static关键字声明它,那么答案就不同了。静态对象一旦通过第一次执行声明它的函数构造,就会继续存在直到程序结束。其数据成员(包括指针)仍然有效。对函数的后续调用将访问同一对象。如果对象已经分配了任何内存,它将保持分配,除非明确删除它。

答案 1 :(得分:4)

指针会被对象的其余部分破坏。无论它指向什么都不受影响(除非对象的析构函数对它做了一些事情)。

答案 2 :(得分:2)

修订答案

变量的两个属性在这里是相关的 - 范围和生命周期 - 我认为问题是将两者混为一谈。

在我能想到的所有上下文中,静态分配的对象的生命周期基本上是进程的生命周期。有一些关于对象首次初始化(构造)的确切时间的技术细节,但最终结果基本相同 - 在进程持续时间内存在静态分配的对象。

但是,一个对象可能进入范围,并且超出范围,因为控制线程在程序中的函数之间移动。对象的范围是名称可见的位置。如果将指向它(或对它的引用)的指针传递给其他不在其他范围内的函数,它可以在别处访问。

由于静态分配的对象具有程序持续时间的生命周期,因此该对象的指针成员不会更改,因为该对象超出了范围;对象继续保持不变,指针成员继续指向同一个地方。显然,如果静态分配的对象中的指针指向具有自动持续时间的变量,并且指向的变量由于被销毁而不再存在,则静态分配的对象中的指针指向无效的位置。

但是,关键点是静态分配的对象不会更改,并且指针成员不会更改,而是更改范围。并且没有因范围变化而导致的泄漏。


原始答案

在我能想到的所有上下文中,静态分配的对象不能超出范围,几乎就是定义。我想如果一个共享库被加载然后卸载,那么一个静态分配的对象可能会“超出范围”,但是否则......

如果这个前提是正确的,那么问题的后半部分很容易。您可以采用以下两种方式之一:

  1. 由于静态对象永远不会超出范围,静态对象及其指针成员都不会发生任何事情,并且当对象返回范围时它将指向同一个位置 - 这里的范围意味着'进入一个函数,可以访问静态对象'。
  2. 当控制线程离开可以访问静态对象的作用域时,静态对象及其指针成员没有任何反应,当对象下一次返回作用域时,它将指向同一个位置。
  3. 基本上说同样的话,两次。如果我第三次说出来,它会自动成真,不是吗?因此,静态分配的对象不会超出范围(即使它不总是可以从当前函数访问),因此指针成员没有任何反应。那......我说的是这样的。我想!

    我错过了什么? “静态创建的对象”是否具有我没有想到的含义?