C++ 内存分配 vs java内存分配

发布时间:2016-12-8 17:50:00 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"C++ 内存分配 vs java内存分配",主要涉及到C++ 内存分配 vs java内存分配方面的内容,对于C++ 内存分配 vs java内存分配感兴趣的同学可以参考一下。

栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用。和堆一样,用户栈在程序执行期间可以动态地扩展和收缩。   堆,就是那些由 new 分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个 new 就要对应一个 delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。堆可以动态地扩展和收缩。   自由存储区,就是那些由 malloc 等分配的内存块,他和堆是十分相似的,不过它是用 free 来结束自己的生命的。   全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的 C 语言中,全局变量又分为初始化的和未初始化的(初始化的全局变量和静态变量在一块区域,未初始化的全局变量与静态变量在相邻的另一块区域,同时未被初始化的对象存储区可以通过 void* 来访问和操纵,程序结束后由系统自行释放),在 C++ 里面没有这个区分了,他们共同占用同一块内存区。   常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多)   明确区分堆与栈   在 BBS 上,堆与栈的区分问题,似乎是一个永恒的话题,由此可见,初学者对此往往是混淆不清的,所以我决定拿他第一个开刀。   首先,我们举一个例子: void f() { int* p=new int[5]; } 内存的三种分配方式: 1. 从静态存储区分配:此时的内存在程序编译的时候已经分配好,并且在程序的整个运行期间都存在。全局变量,static变量等在此存储。 2. 在栈区分配:相关代码执行时创建,执行结束时被自动释放。局部变量在此存储。栈内存分配运算内置于处理器的指令集中,效率高,但容量有限。 3. 在堆区分配:动态分配内存。用new/malloc时开辟,delete/free时释放。生存期由用户指定,灵活。但有内存泄露等问题。     常见内存错误及对策 1. 内存分配未成功,却被使用。 对策:使用内存之前检查是否分配成功。用p!=NULL判断。 2. 内存分配成功,未初始化就被使用。 内存的缺省值没有统一的标准。大部分编译器以0作为初始值,但不完全是。 对策:内存初始化时赋初值。 3. 内存操作越界。 对策:只能是小心了。 4. 释放了内存,仍然使用。 (1) 使用显示delete和free的野指针。 对策:释放完内存,将指针置为NULL。 (2) 使用隐式delete和free的野指针。主要是指函数返回指向栈内存的指针或引用。 对策:当然是不要返回就可以了。 5. 未释放内存,导致内存泄露。 用new/malloc开辟了内存,没用delete/free释放. 对策:new和delete的个数一定相同;malloc和free的个数一定相同;new[]和[]delete一定对应。  Java内存分配中的栈在函数中定义的一些基本类型的变量数据和对象的引用变量都在函数的栈内存中分配。  当在一段代码块定义一个变量时,Java就在栈中 为这个变量分配内存空间,当该变量退出该作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。Java内存分配中的堆堆内存用来存放由new创建的对象和数组。 在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或对象后,还可以 在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。  引用变量就相当于是 为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。引用变量就相当于是为数组或者对象起的一个名称。引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配,即使程序 运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍 然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。这也是 Java 比较占内存的原因。

上一篇:appstore苹果商店支付对接总结
下一篇:Axure rp

相关文章

相关评论