1.初始化
引用和常量:必须通过构造函数的参数列表的方式初始化。 静态变量: 必须在类定义体外进行初始化与定义 静态常量:可以直接在类中初始化,也可以在类中声明,在类定义体外进行定义
静态成员属于类作用域,但不属于类对象,它的生命周期和普通的静态变量一样,程序运行时进行分配内存和初始化,程序结束时则被释放。所以不能在类的构造函数中进行初始化。
静态函数: 因为static成员函数没有this指针,所以静态成员函数不可以访问非静态成员。 非静态成员函数可以访问静态成员。 静态数据成员与类的大小无关,因为静态成员只是作用在类的范围而已。
初始化顺序:全局成员与静态成员一起按照声明顺序进行初始化
2.释放
静态成员是排列在静态存储区的数据,可由程序在退出时释放,而静态函数则是相应的指向代码段的指针。 不能够提前释放静态变量,因为程序结束时会自动释放静态变量,导致重复释放引发问题
3.实际应用中的问题
多线程与静态变量间最常见的问题就是可能线程会在静态变量被释放后去访问。常用的解决办法就是避免使用非基础变量的全局对象,将他们分配在堆里面,然后完善线程的停止机制。 Qt中使用全局线程池QThreadPool::globalInstance()出现过线程没有释放的引发了内存问题,需要使用强制方法关闭线程,然后引发了重复释放导致崩溃(?)这里的问题可能与Qt本身有关,当时没有细究。解决的办法是一些笨办法:对线程函数进行了更频繁的停止检查,对耗时操作的时机进行一定的限制。
|