局部变量,参数变量存放在栈中,当离开作用范围后,分配的内存在作用范围外会被系统自动回收。
切记!不要使用局部变量的指针和引用!
在函数结束后,局部变量被释放后,指针和引用可能在短时间内可以使用,也可能会立即失效。因为在指针和引用所指向和代表的
内存一旦被重新分配就会导致该指针和引用会立即失去原本想要存储的值,出现严重的语义错误。
要想确保返回的引用或者指针是正确的,不妨提问:引用所引的对象或指针所指的对象是在函数之前已经存在的哪个对象?
new出来的内存空间存放在堆中,不受作用域管理,不会被系统自动回收,只有在使用delete删除或者整个程序结束后才会释放内存。
因此很容易发生忘记delete而造成内存泄漏事件。例如在某个函数中定义有:
A* a=new A();
则指针a在函数运行完毕后将销毁,但是new出来的内存并不会被销毁,需要执行delete a;才能被销毁。
此外static变量,全局变量的有效期都是整个程序运行期。
而智能指针的出现则是在指针被销毁的情况下,也会销毁指针指向的内存,避免内存泄漏发生。
这是一种常见的内存泄露的情况。尽量避免手动管理指针,采用c++11中的shared_ptr和unique_ptr来管理。
但是有一种情况可以使用局部变量的引用,就是可以在f函数中调用g函数的时候,使用局部变量b作为函数f中调用g函数的引用形
参b。
因为这里与函数的递归类似,在A函数没有结束之前,它的调用栈还没用被释放就在其中又调用了一个B函数,并且在这个B函数
中使用了A函数中的临时变量的引用,这样就不会出现在使用这个引用的时候,出现混乱的现象,是可以的。
int f(int &a){
int b=a-1;
g(b);
}
int g(int &b){
cout<<b;
}
同时,若在函数A中直接对B函数调用,并且B这个函数的形参使用该临时变量的一个计算值即一个右值传递给这个形参,需要使
这个形参设置为const。因为右值即将销毁,表达式求值过程中创建的临时变量。即以下情形。
int f(int &a){
g(b-1);
}
int g(const int &b){
cout<<b;
}
定义全局变量
使用全局变量
先在定义全局变量的.h文件中使用extern int g_i;定义全局变量
再在要使用全局变量的.cpp文件中包含该.h文件,对该全局变量定义一下,在最外层定义int g_i;
其他cpp若要使用该全局变量,只需要也包含该.h文件。
需要注意的是只能定义一次,第一次在最外层定义了全局变量后不能再定义。