那个视频网站最好最全网址,互联网保险和线下保险的优缺点,工程建设的概念是什么,网页制作和设计实验报告1.2 C内存
参考 https://www.nowcoder.com/issue/tutorial?tutorialId93uuid8f38bec08f974de192275e5366d8ae24
1.2.1 简述一下堆和栈的区别 参考回答
区别#xff1a;
堆栈空间分配不同。栈由操作系统自动分配释放 #xff0c;存放函数的参数值#xff0c;局部变…1.2 C内存
参考 https://www.nowcoder.com/issue/tutorial?tutorialId93uuid8f38bec08f974de192275e5366d8ae24
1.2.1 简述一下堆和栈的区别 参考回答
区别
堆栈空间分配不同。栈由操作系统自动分配释放 存放函数的参数值局部变量的值等堆一般由程序员分配释放。
堆栈缓存方式不同。栈使用的是一级缓存 它们通常都是被调用时处于存储空间中调用完毕立即释放堆则是存放在二级缓存中速度要慢些。
堆栈数据结构不同。堆类似数组结构栈类似栈结构先进后出。
1.2.2 简述C的内存管理 参考回答
内存分配方式
在C中内存分成5个区他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
栈在执行函数时函数内局部变量的存储单元都可以在栈上创建函数执行结束时这些存储单元自动被释放。
堆就是那些由new分配的内存块一般一个new就要对应一个delete。
自由存储区就是那些由malloc等分配的内存块和堆是十分相似的不过是用free来结束自己的生命。
全局/静态存储区全局变量和静态变量被分配到同一块内存中
常量存储区这是一块比较特殊的存储区里面存放的是常量不允许修改。
常见的内存错误及其对策
1内存分配未成功却使用了它。
2内存分配虽然成功但是尚未初始化就引用它。
3内存分配成功并且已经初始化但操作越过了内存的边界。
4忘记了释放内存造成内存泄露。
5释放了内存却继续使用它。
对策
1定义指针时先初始化为NULL。
2用malloc或new申请内存之后应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存。
3不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。
4避免数字或指针的下标越界特别要当心发生“多1”或者“少1”操作
5动态内存的申请与释放必须配对防止内存泄漏
6用free或delete释放了内存之后立即将指针设置为NULL防止“野指针”
7使用智能指针。 内存泄露及解决办法
3.什么是内存泄露
简单地说就是申请了一块内存空间使用完毕后没有释放掉。1new和malloc申请资源使用后没有用delete和free释放2子类继承父类时父类析构函数不是虚函数。3Windows句柄资源使用后没有释放。
怎么检测
第一良好的编码习惯使用了内存分配的函数一旦使用完毕,要记得使用其相应的函数释放掉。
第二将分配的内存的指针以链表的形式自行管理使用完毕之后从链表中删除程序结束时可检查改链表。
第三使用智能指针。
第四一些常见的工具插件如ccmalloc、Dmalloc、Leaky、Valgrind等等。
1.2.3 malloc和局部变量分配在堆还是栈 参考回答 malloc是在堆上分配内存需要程序员自己回收内存局部变量是在栈中分配内存超过作用域就自动回收。1.2.4 程序有哪些section分别的作用程序启动的过程怎么判断数据分配在栈上还是堆上 参考回答
1.2.4 程序有哪些section分别的作用程序启动的过程怎么判断数据分配在栈上还是堆上 参考回答
一个程序有哪些section
如上图从低地址到高地址一个程序由代码段、数据段、BSS段、堆、共享区、栈等组成。
数据段存放程序中已初始化的全局变量和静态变量的一块内存区域。
代码段存放程序执行代码的一块内存区域。只读代码段的头部还会包含一些只读的常数变量。
BSS 段存放程序中未初始化的全局变量和静态变量的一块内存区域。
可执行程序在运行时又会多出两个区域堆区和栈区。
堆区动态申请内存用。堆从低地址向高地址增长。
栈区存储局部变量、函数参数值。栈从高地址向低地址增长。是一块连续的空间。
最后还有一个共享区位于堆和栈之间。
程序启动的过程
操作系统首先创建相应的进程并分配私有的进程空间然后操作系统的加载器负责把可执行文件的数据段和代码段映射到进程的虚拟内存空间中。
加载器读入可执行程序的导入符号表根据这些符号表可以查找出该可执行程序的所有依赖的动态链接库。
加载器针对该程序的每一个动态链接库调用LoadLibrary 1查找对应的动态库文件加载器为该动态链接库确定一个合适的基地址。 2加载器读取该动态链接库的导入符号表和导出符号表比较应用程序要求的导入符号是否匹配该库的导出符号。 3针对该库的导入符号表查找对应的依赖的动态链接库如有跳转则跳到3 4调用该动态链接库的初始化函数
初始化应用程序的全局变量对于全局对象自动调用构造函数。
进入应用程序入口点函数开始执行。
怎么判断数据分配在栈上还是堆上首先局部变量分配在栈上而通过malloc和new申请的空间是在堆上。 1.2.5 初始化为0的全局变量在bss还是data 参考回答
BSS段通常是指用来存放程序中未初始化的或者初始化为0的全局变量和静态变量的一块内存区域。特点是可读写的在程序执行之前BSS段会自动清0。
1.2.6 什么是内存泄露内存泄露怎么检测 参考回答
什么是内存泄露
简单地说就是申请了一块内存空间使用完毕后没有释放掉。1new和malloc申请资源使用后没有用delete和free释放2子类继承父类时父类析构函数不是虚函数。3Windows句柄资源使用后没有释放。
怎么检测
第一良好的编码习惯使用了内存分配的函数一旦使用完毕,要记得使用其相应的函数释放掉。
第二将分配的内存的指针以链表的形式自行管理使用完毕之后从链表中删除程序结束时可检查改链表。
第三使用智能指针。
第四一些常见的工具插件如ccmalloc、Dmalloc、Leaky、Valgrind等等。