关于C#:关于指针和对象的问题?

 2021-04-27 

Question about pointers and objects?

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


指针什么都没有发生,只是不存在了。如果它指向需要释放的内容,则只会导致内存泄漏。

将代码添加到用于正确清理指针的析构函数中,或使用自动清理后的"智能指针"。

编辑:如果您实际上是在创建静态对象,则通过在函数内使用static关键字进行声明,则答案是不同的。静态对象一旦由声明该函数的函数的第一次执行构成,便会继续存在,直到程序结束。其数据成员(包括指针)将保持有效。随后对该函数的调用将访问相同的对象。如果对象已分配了任何内存,除非有明确删除它,否则它将保持分配状态。


指针将与对象的其余部分一起破坏。它指向的对象根本不受任何影响(除非对象的析构函数对其执行任何操作)。


修改后的答案

变量的两个属性在这里是相关的-作用域和生存期-我认为问题是将两者混为一谈。

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

但是,当控制线程在程序中的函数之间移动时,对象可能会进入范围,也可能超出范围。对象的范围是按名称可见的位置。如果将指向它(或对其的引用)的指针传递给其他函数,则该函数可能在其他位置可访问,否则该函数将不在范围之内。

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

但是,关键是静态分配的对象没有更改,指针成员也没有更改,但是范围发生了变化。并且没有因范围的变化而引起的泄漏。

原始答案

在我能想到的所有情况下,静态分配的对象都不会超出范围,这在定义上几乎是可以的。我想如果加载了共享库然后又卸载了共享库,则静态分配的对象可能会"超出范围",但是否则...

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

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

    我想念什么?"静态创建的对象"是否具有我没有想到的含义?