C++成员函数中的静态变量

35 浏览
0 Comments

C++成员函数中的静态变量

对于像这样的代码:\n

class foo{
  void bar(){
     static int var = 2;
  }
};

\n我知道对于所有类型为foo的对象,只会有一个var的实例,但是C++是否在创建foo之前就已经为变量var分配内存?我问这个问题是因为即使foo被销毁后,var仍然会在整个程序中存在。

0
0 Comments

C++中,静态变量在成员函数中的使用是一个常见的问题。下面我们来整理一下这个问题出现的原因以及解决方法。

首先,静态变量的生命周期与程序的生命周期相关。当程序开始运行时,静态变量的存储空间就会被分配。而当程序终止时,静态变量会被销毁。需要注意的是,这里的foo是一个类,而不是一个对象实例,所以foo本身并不会被销毁。

然而,foo的静态成员却会在程序的反初始化过程中被销毁。对于一个int类型的静态成员来说,这个过程当然是一个空操作。

在这个讨论中,某些情况下了C++标准,指出静态变量的存储空间在程序开始时就被分配了。他们给出了一个关于存储持续时间的链接,更详细地说明了这一点。但是,也某些情况下了这个链接是否真的引用了C++标准,因为他们没有看到标准中的具体内容。

总结一下,C++中静态变量在成员函数中使用的原因是因为静态变量的生命周期与程序的生命周期相关。解决这个问题的方法是在成员函数中正确地使用静态变量,并且在程序终止前不要对其进行销毁操作。

希望以上内容对您有所帮助!

0
0 Comments

C++中的静态变量可以在成员函数中使用,但是它们在函数调用之前就已经分配了内存空间。具体来说,变量的内存空间是在函数调用之前预留的,但是变量的值在何时写入内存是有具体实现决定的。标准只保证这个值会在调用foo::bar()之前的某个时间点写入。

如果你使用具有副作用的表达式来初始化静态变量(比如调用函数),那么这个函数调用会在第一次执行函数时执行。

即使在foo被销毁之后,var也会在整个程序中存在。在任何时候调用foo::bar(),你都会得到程序中最后一次给var赋值的值。

那么在第一次调用foo::bar()之前会发生什么呢?如果初始化的值具有副作用(在C++中是允许的,但在C中不允许),那么这些副作用会在不可预测的时间发生吗?

内存分配并不代表初始化。在函数第一次调用时,会对先前分配的内存区域进行初始化。需要注意的是,内存空间在程序启动时静态地分配,而不是使用malloc或类似的函数。

这些讨厌的副作用啊!谢谢!

0