MST

星途 面试题库

面试题:C++ 中存储位置对变量生命周期及访问控制的影响

假设你有一个包含全局变量、局部变量和静态局部变量的C++程序。阐述这些不同类型变量由于存储位置不同,在生命周期和访问控制方面有哪些特点和区别?并且说明在多线程环境下,这些变量的存储位置会带来哪些潜在问题?
17.8万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

全局变量

  1. 存储位置:存储在全局数据区(静态存储区)。
  2. 生命周期:从程序启动开始,到程序结束时销毁。
  3. 访问控制:在整个程序的所有文件中都可以访问(需注意作用域规则,若在某个源文件中定义为static,则只能在该源文件内访问)。
  4. 多线程问题:多个线程可能同时访问和修改全局变量,容易引发竞态条件,导致数据不一致问题。通常需要使用同步机制(如互斥锁)来保护对全局变量的访问。

局部变量

  1. 存储位置:一般存储在栈上(动态存储区),对于函数内的对象,会在栈上分配空间。但如果局部变量是用new动态分配的,那么它存储在堆上。
  2. 生命周期:从变量声明处开始,到所在代码块结束时销毁。函数调用结束,局部变量在栈上的空间会被释放。
  3. 访问控制:只能在声明它的代码块内访问。
  4. 多线程问题:每个线程都有自己独立的栈空间,因此局部变量在线程间是隔离的,一般不会出现多线程访问冲突问题。不过,若局部变量指向了共享资源(如通过new分配在堆上的内存),依然可能产生竞态条件。

静态局部变量

  1. 存储位置:存储在全局数据区(静态存储区),和全局变量类似。
  2. 生命周期:从第一次执行到其声明语句开始,直到程序结束时销毁。即使所在函数多次调用,静态局部变量的值也会保持上次调用结束时的值。
  3. 访问控制:只能在声明它的函数内访问,具有函数作用域。
  4. 多线程问题:由于静态局部变量存储在全局数据区,多个线程可能同时访问和修改它,同样可能引发竞态条件,需要同步机制来保护。