C++ 关于指针和对象的问题?
我只是想知道,如果我静态地创建一个对象,其中有一个指针作为数据成员,然后该对象超出范围,指针会发生什么情况?C++ 关于指针和对象的问题?,c++,pointers,scope,C++,Pointers,Scope,我只是想知道,如果我静态地创建一个对象,其中有一个指针作为数据成员,然后该对象超出范围,指针会发生什么情况? Chuma指针与对象的其余部分一起被销毁。它指向的任何对象都不会受到影响(除非对象的析构函数对其进行了处理)。指针将与对象的其余部分一起销毁。它指向的任何对象都不会受到任何影响(除非对象的析构函数对其进行了处理)。指针完全没有任何变化,它只是不再存在。如果它指向某个需要释放的内容,那么就是内存泄漏 要么向析构函数添加代码以正确清理指针,要么使用“智能指针”自动清理指针 Edit:如果您实
Chuma指针与对象的其余部分一起被销毁。它指向的任何对象都不会受到影响(除非对象的析构函数对其进行了处理)。指针将与对象的其余部分一起销毁。它指向的任何对象都不会受到任何影响(除非对象的析构函数对其进行了处理)。指针完全没有任何变化,它只是不再存在。如果它指向某个需要释放的内容,那么就是内存泄漏 要么向析构函数添加代码以正确清理指针,要么使用“智能指针”自动清理指针
Edit:如果您实际上是在创建一个静态对象,在函数中用
static
关键字声明它,那么答案就不同了。静态对象一旦由声明它的函数的第一次执行构造,就会继续存在,直到程序结束。其数据成员(包括指针)将保持有效。对函数的后续调用将访问同一对象。如果对象已经分配了任何内存,它将保持分配状态,除非有什么东西显式删除它。指针完全没有任何变化,它只是不再存在。如果它指向某个需要释放的内容,那么就是内存泄漏
要么向析构函数添加代码以正确清理指针,要么使用“智能指针”自动清理指针
Edit:如果您实际上是在创建一个静态对象,在函数中用static
关键字声明它,那么答案就不同了。静态对象一旦由声明它的函数的第一次执行构造,就会继续存在,直到程序结束。其数据成员(包括指针)将保持有效。对函数的后续调用将访问同一对象。如果对象已分配了任何内存,则它将保持已分配状态,除非有明确的内容将其删除。
一个变量有两个相关的属性——作用域和生存期——我认为问题是将这两个属性混为一谈
在我能想到的所有上下文中,静态分配的对象都有一个生命周期,本质上就是进程的生命周期。关于对象首次初始化(构造)的确切时间,有一些技术细节,但最终结果基本上是相同的——在整个过程中存在一个静态分配的对象
然而,当控制线程在程序中的函数之间移动时,对象可能进入作用域,也可能离开作用域。对象的范围是其名称可见的位置。如果指向它的指针(或对它的引用)被传递到其他函数,而在其他函数中它不在作用域中,则可以在其他地方访问它
由于静态分配的对象的生命周期为程序的持续时间,因此该对象的指针成员不会因为对象超出范围而改变;对象继续存在,不变,指针成员继续指向同一位置。显然,如果静态分配对象中的指针指向具有自动持续时间的变量,并且指向该变量的指针由于被破坏而不再存在,那么静态分配对象中的指针指向无效位置
但是,关键的一点是静态分配的对象没有改变,指针成员没有改变,而是范围发生了变化。并且没有因范围变化而导致的泄漏
原始答案 在我所能想到的所有上下文中,静态分配的对象都不能超出范围,这在很大程度上取决于定义。我想,如果加载并卸载共享库,那么静态分配的对象可能会“超出范围”,否则 如果这个前提是正确的,那么问题的后半部分就简单了。您可以选择以下两种视图之一: