只是想知道,如果我静态创建一个指针作为数据成员的对象,然后对象超出范围,指针会发生什么? Chuma的
答案 0 :(得分:12)
指针根本没有发生任何事情,它就不复存在了。如果它指向需要释放的东西,那么你就会发生内存泄漏。
将代码添加到析构函数中以正确清理指针,或者使用“智能指针”自动清理它们。
编辑:如果你真的想要创建一个静态对象,通过在函数内使用static
关键字声明它,那么答案就不同了。静态对象一旦通过第一次执行声明它的函数构造,就会继续存在直到程序结束。其数据成员(包括指针)仍然有效。对函数的后续调用将访问同一对象。如果对象已经分配了任何内存,它将保持分配,除非明确删除它。
答案 1 :(得分:4)
指针会被对象的其余部分破坏。无论它指向什么都不受影响(除非对象的析构函数对它做了一些事情)。
答案 2 :(得分:2)
变量的两个属性在这里是相关的 - 范围和生命周期 - 我认为问题是将两者混为一谈。
在我能想到的所有上下文中,静态分配的对象的生命周期基本上是进程的生命周期。有一些关于对象首次初始化(构造)的确切时间的技术细节,但最终结果基本相同 - 在进程持续时间内存在静态分配的对象。
但是,一个对象可能进入范围,并且超出范围,因为控制线程在程序中的函数之间移动。对象的范围是名称可见的位置。如果将指向它(或对它的引用)的指针传递给其他不在其他范围内的函数,它可以在别处访问。
由于静态分配的对象具有程序持续时间的生命周期,因此该对象的指针成员不会更改,因为该对象超出了范围;对象继续保持不变,指针成员继续指向同一个地方。显然,如果静态分配的对象中的指针指向具有自动持续时间的变量,并且指向的变量由于被销毁而不再存在,则静态分配的对象中的指针指向无效的位置。
但是,关键点是静态分配的对象不会更改,并且指针成员不会更改,而是更改范围。并且没有因范围变化而导致的泄漏。
在我能想到的所有上下文中,静态分配的对象不能超出范围,几乎就是定义。我想如果一个共享库被加载然后卸载,那么一个静态分配的对象可能会“超出范围”,但是否则......
如果这个前提是正确的,那么问题的后半部分很容易。您可以采用以下两种方式之一:
基本上说同样的话,两次。如果我第三次说出来,它会自动成真,不是吗?因此,静态分配的对象不会超出范围(即使它不总是可以从当前函数访问),因此指针成员没有任何反应。那......我说的是这样的。我想!
我错过了什么? “静态创建的对象”是否具有我没有想到的含义?