所以我第一次尝试使用多个类和对象。
假设我有这样的感觉
class control
{
public:
~control();
protected:
/*char* location*/
static node** adjacency_list;
};
我需要adjacency_list指针信息可供所有派生类对象使用,所以我在基类中将其声明为静态(如我之前的问题所述)。
我的问题是:当我将此变量定义为:
node** control::adjacency_list= new node[MAX];
源文件中的,在我的构造函数之外, adjacency_list
的真实范围是什么?
显然范围解析运算符在那里,所以我假设这个变量只对这个类的对象以及从control
类派生的任何其他类可用。但阅读静态与全局变量线程让我感到困惑,我想看看我是否遗漏了一些信息。
我的~control()
析构函数是否也可以释放在此实例中使用new
分配的内存?
答案 0 :(得分:0)
您实际上正在使用术语"范围"太宽泛了。并非所有(你似乎)描述为范围的东西都是范围。
范围在班级control
内。这就是使用范围解析运算符(::
)的原因,静态成员的全名是control::adjacency_list
。
(从技术上讲,计算机科学中还有其他范围的定义 - 我只是使用了一个在C ++中最有意义的定义。)
成员的可访问性与范围不同,并影响其他函数或类型可以直接访问control::adjacency_list
(类control
本身,朋友,派生类和结构)。
control::adjacency_list
,因为它具有static
存储持续时间,将一直存在,直到程序终止(与control::adjacency_list
的初始化方式无关,或者在程序执行期间如何更改其值)。
任何control::adjacency_list
点的生命周期也与范围不同(并且与control::adjacency_list
本身的生命周期不同),并且取决于它是如何初始化的。如果您使用运算符new []
来执行此操作,则生命周期将指向相应的运算符delete []
。
除非您使用特定逻辑来管理任何control::adjacency_list
点的生命周期,否则在控制析构函数中释放它通常不是一个好主意。但是,有些技术可能很有用(例如,使用类control
的引用计数,而析构函数仅在control::adjacency_list
的最后一个实例被破坏时才释放control
。这种决定取决于你的要求和设计 - 没有绝对的答案。
顺便提一句,您声称的初始化方法可能不正确,因为
node** control::adjacency_list= new node[MAX];
不会编译。表达式new node[MAX]
(假设MAX
是一个整数值)给出类型node *
的结果。这不能隐式转换为node **
。