【发布时间】:2009-10-16 22:28:15
【问题描述】:
只是想知道,如果我静态地创建了一个将指针作为数据成员的对象,然后该对象超出了范围,那么指针会发生什么? 楚马
【问题讨论】:
-
在您的情况下,“静态创建”是什么意思?您认为“超出范围”一词的含义是什么?
-
我编辑了我接受的答案,你可能想再看一遍。
只是想知道,如果我静态地创建了一个将指针作为数据成员的对象,然后该对象超出了范围,那么指针会发生什么? 楚马
【问题讨论】:
指针根本没有发生任何事情,它只是不复存在。如果它指向需要释放的东西,那么你只是发生了内存泄漏。
要么向析构函数中添加代码以正确清理指针,要么使用自动清理的“智能指针”。
编辑:如果您实际上的意思是创建一个静态对象,通过在函数内使用 static 关键字声明它,那么答案就不同了。静态对象,一旦由声明它的函数的第一次执行构建,将继续存在,直到程序结束。它的数据成员,包括指针,将保持有效。对该函数的后续调用将访问同一对象。如果对象分配了任何内存,它将保持分配状态,除非有什么明确删除它。
【讨论】:
指针与对象的其余部分一起被销毁。无论它指向什么都不会受到影响(除非对象的析构函数对其进行了处理)。
【讨论】:
这里有两个相关的变量属性——作用域和生命周期——我认为问题是把两者混为一谈。
在我能想到的所有上下文中,静态分配的对象的生命周期本质上就是进程的生命周期。有一些关于对象首次初始化(构造)的确切时间的技术细节,但最终结果基本相同 - 在整个过程中存在一个静态分配的对象。
但是,当控制线程在程序中的函数之间移动时,对象可能会进入范围,也可能会超出范围。对象的范围是按名称可见的地方。如果将指向它的指针(或对它的引用)传递给其他不在范围内的函数,则它可以在其他地方访问。
由于静态分配的对象具有程序持续时间的生命周期,因此该对象的指针成员不会因为对象超出范围而改变;对象继续存在不变,指针成员继续指向同一个地方。显然,如果静态分配对象中的指针指向具有自动持续时间的变量,并且该指向的变量因为被销毁而不再存在,那么静态分配对象中的指针指向无效位置。
不过,关键是静态分配的对象没有变化,指针成员也没有变化,只是作用域发生了变化。并且没有因范围变化而导致的泄漏。
在我能想到的所有上下文中,静态分配的对象都不能超出范围,几乎按照定义。我想如果一个共享库被加载然后卸载,那么一个静态分配的对象可能会“超出范围”,否则......
如果这个前提是正确的,那么问题的后半部分就很简单了。您可以采用两种视图中的任何一种:
这基本上是在说同样的事情,两次。如果我说第三次,它就会自动成为真的,不是吗?因此,静态分配的对象不会超出范围(即使它并不总是可以从当前函数访问),因此指针成员不会发生任何事情。那里……我说的是这样。我想!
我错过了什么? “静态创建的对象”是否有我没有想到的含义?
【讨论】: