C++函数执行完后内存释放问题

C++函数执行完后内存释放问题,第1张

你能考虑到内存问题已经很不错了,不过C/C++指针以及内存管理问题一直都是新手迷茫的问题。

对于你的问题,我简单说几点吧:

1)在C/C++中内存有堆、栈之分(当然还有其他的,具体可以参考数据结构一类的书)。

2)堆是用户管理的,C中一般用malloc()和free()管理,C++用new 和delete管理,而栈是计算机管理的不需要用户干预,但栈的大小有限,特别是嵌入式系统,在函数调用时,对于大的结构体一般传指针(32位系统固定4个字节,其他系统等于AB(地址总线的宽度),参考微机原理一类的书),因为函数传参时,对于std_call,也需要压栈,大的结构体变量会使内存耗完,设备立马会死翘翘,而该类故障没用语法错误,很难排查,一旦交付到用户手里,出了问题就麻烦了。

3)对于一个函数不会给函数体开辟一段内存,函数原代码被编译器翻译成二进制后是放在代码段(CS段,可参考微机原理一类书籍),然后每一个函数会有一个入口地址,函数调用时会寻找这个地址,然后转到这个地址执行函数内部代码,当然调用的地址也会保持,以便返回,这叫函数调用时上下文(context),中断也有类似的过程(可参考微机原理一类的书籍)。

4)函数内部的变量我们叫局部变量(local variable),如:

int foo(void)

{

int test = 0;// Local variable

int ptr = (int) malloc(sizeof(int));// for C/C++ languange,

objiect o_ptr = new objiect();// for C++ only

}

test变量为局部变量,函数执行时分配内存,分配到栈上,函数执行完释放,ptr 和o_ptr 自己所占有的空间,同test变量,但是二者指向的空间被分配到了堆上,该函数被执行完后不会被释放,而会造成内存泄露。

不正确,函数内的静态变量在该函数调用结束后,且该函数所在的模块没有被释放的情况下,这个静态变量值为上次函数调用后的值。这样说比较抽象。举例说明一下:

void AA()

{

static int s_iCount; //C语言默认初始化0值

s_iCount++; //每调用AA()一次,s_iCount会自加一次

printf("%d\n", s_iCount);

}

void main()

{

AA(); //第一次调用

AA(); //第二次调用

}

运行输出:

1

2

说明:AA()中的 s_iCount,只能在AA()中访问 *** 作,不能在其外的函数中 *** 作,也不能在main()中直接访问。

只要访问过p指针,都会变化(连续printf两次,结果不一样)

f函数结束,p指向地址已经释放,但是该内存单元依然存有原来的数据,我个人认为,访问p之后,由于一些系统内部 *** 作,导致p指向内存单元被回收,内部机制不清楚,纯属个人猜测

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/11671257.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-17
下一篇2023-05-17

发表评论

登录后才能评论

评论列表(0条)

    保存