一些关于内存泄露、栈溢出和野指针的内容(头秃
2021/4/12 7:30:01
本文主要是介绍一些关于内存泄露、栈溢出和野指针的内容(头秃,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
内存泄漏&栈溢出
C++中,我们主要涉及的内存是栈和堆,
堆 (By programmer) 申请后由程序员主动释放,遗忘后果严重;
栈 (By compiler)需要时由编译器分配,在不需要时自动清除的存储区。一般用于存放局部变量、函数参数。
这些存放在栈中的数据只在当前函数及下一层函数中有效,一旦函数返回了,会发生自动释放。
除此外还有
静态存储区 全局&静态变量在同一块内存中;
常量存储区 常量、不允许修改;
代码区 不允许修改、可执行;
回到发生内存泄漏的场景。
通常来说,一个线程的栈内存是有限的。栈上的内存通常是由编译器来自动管理的。当在栈上分配一个新的变量时,或进入一个函数时,栈的指针会下移,相当于在栈上分配了一块内存,当这个变量的生命周期结束时,栈的指针会上移。
由于栈上的内存的分配和回收都是由编译器控制的,所以在栈上是不会发生内存泄露的,只会发生栈溢出(Stack Overflow),也就是分配的空间超过了规定的栈大小。而当在堆上申请内存后忘记使用 free/delete 来回收,就发生了内存泄露。
内存泄漏检测
https://www.cnblogs.com/skynet/archive/2011/02/20/1959162.html 不赘述
野指针
指向一个已删除的对象或未申请访问受限内存区域的指针。
需要通过养成良好的编程习惯来尽力减少。对野指针进行操作很容易造成程序错误。
-
指针变量未初始化
创建新指针时应该对其初始化,设置为NULL或者指向合法的内存,不然会被随机指向任意空间。
-
野指针指针释放后之后未置空
free或delete只是把指针所指的内存给释放掉,但并没有结束指针本身。释放后的指针应立即将指针置为NULL,防止产生“野指针”。
-
野指针指针操作超越变量作用域
不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。
class A { public: void Func(void) { cout << “Func of class A” << endl; } }; class B { public: A *p; void Test(void) { A a; p = &a; //a是函数Test中的局部量,而不属于整个class B } void Test1() { p->Func(); // p 是“野指针” } };
a在void Test(void)函数结束时会被释放,所以在函数void Test1()中的指针p就是野指针。
这篇关于一些关于内存泄露、栈溢出和野指针的内容(头秃的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南