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

C++ 关于指针和对象的问题?,c++,pointers,scope,C++,Pointers,Scope,我只是想知道,如果我静态地创建一个对象,其中有一个指针作为数据成员,然后该对象超出范围,指针会发生什么情况? Chuma指针与对象的其余部分一起被销毁。它指向的任何对象都不会受到影响(除非对象的析构函数对其进行了处理)。指针将与对象的其余部分一起销毁。它指向的任何对象都不会受到任何影响(除非对象的析构函数对其进行了处理)。指针完全没有任何变化,它只是不再存在。如果它指向某个需要释放的内容,那么就是内存泄漏 要么向析构函数添加代码以正确清理指针,要么使用“智能指针”自动清理指针 Edit:如果您实

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

指针与对象的其余部分一起被销毁。它指向的任何对象都不会受到影响(除非对象的析构函数对其进行了处理)。

指针将与对象的其余部分一起销毁。它指向的任何对象都不会受到任何影响(除非对象的析构函数对其进行了处理)。

指针完全没有任何变化,它只是不再存在。如果它指向某个需要释放的内容,那么就是内存泄漏

要么向析构函数添加代码以正确清理指针,要么使用“智能指针”自动清理指针


Edit:如果您实际上是在创建一个静态对象,在函数中用
static
关键字声明它,那么答案就不同了。静态对象一旦由声明它的函数的第一次执行构造,就会继续存在,直到程序结束。其数据成员(包括指针)将保持有效。对函数的后续调用将访问同一对象。如果对象已经分配了任何内存,它将保持分配状态,除非有什么东西显式删除它。

指针完全没有任何变化,它只是不再存在。如果它指向某个需要释放的内容,那么就是内存泄漏

要么向析构函数添加代码以正确清理指针,要么使用“智能指针”自动清理指针

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

一个变量有两个相关的属性——作用域和生存期——我认为问题是将这两个属性混为一谈

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

然而,当控制线程在程序中的函数之间移动时,对象可能进入作用域,也可能离开作用域。对象的范围是其名称可见的位置。如果指向它的指针(或对它的引用)被传递到其他函数,而在其他函数中它不在作用域中,则可以在其他地方访问它

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

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


原始答案 在我所能想到的所有上下文中,静态分配的对象都不能超出范围,这在很大程度上取决于定义。我想,如果加载并卸载共享库,那么静态分配的对象可能会“超出范围”,否则

如果这个前提是正确的,那么问题的后半部分就简单了。您可以选择以下两种视图之一:

  • 由于静态对象从不超出作用域,因此静态对象及其指针成员不会发生任何变化,当对象返回作用域时,它将指向同一个位置,这里的作用域表示“进入一个可以访问静态对象的函数”
  • 当控制线程离开一个可以访问静态对象的作用域时,静态对象及其指针成员将不会发生任何变化,当对象下次返回作用域时,它将指向同一个位置
  • 这基本上是说同一件事,两次。如果我第三次这么说,那肯定是真的,不是吗?因此,静态分配的对象不会超出范围(即使它不总是可以从当前函数访问),因此指针成员不会发生任何变化。好了,我说的是真的。我想

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

    修改后的答案 一个变量有两个相关的属性——作用域和生存期——我认为问题是将这两个属性混为一谈

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

    然而,当控制线程在程序中的函数之间移动时,对象可能进入作用域,也可能离开作用域。对象的范围是其名称可见的位置。如果指向它的指针(或对它的引用)被传递到其他函数,而该函数不会被访问,则可以在其他地方访问它