C++中局部变量和全局变量的存储位置和内存回收机制 | 您所在的位置:网站首页 › 静态变量怎么释放 › C++中局部变量和全局变量的存储位置和内存回收机制 |
局部变量,参数变量存放在栈中,当离开作用范围后,分配的内存在作用范围外会被系统自动回收。 切记!不要使用局部变量的指针和引用! 在函数结束后,局部变量被释放后,指针和引用可能在短时间内可以使用,也可能会立即失效。因为在指针和引用所指向和代表的 内存一旦被重新分配就会导致该指针和引用会立即失去原本想要存储的值,出现严重的语义错误。
要想确保返回的引用或者指针是正确的,不妨提问:引用所引的对象或指针所指的对象是在函数之前已经存在的哪个对象?
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 |
今日新闻 |
推荐新闻 |
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 |