[基础] C++与JAVA的内存管理
在内存管理上(总之一句话——以后C++工程,一定要用智能指针!)
1、同是new一个对象,C++一定得手动delete掉,而且得时刻记住能delete的最早时间(避免使用空指针)。JAVA可以存活于作用域之外,也就是说如果要使用某一对象或者其引用,它的内存就不会被释放。那JAVA如何避免内存被填满呢?它有一个垃圾回收器Garbage Collector,作用是自动将不需要的对象内存给释放掉,这样就消除了内存泄露的问题。在内存管理这一点上,可以说C++灵活性更好,JAVA健壮性更好,虽然事实上JAVA虚拟机内部还是使用的指针。
2、JAVA和C++的内存区:
- 栈内存空间:保存所有的对象名称(更准确地说是保存了引用的堆内存空间的地址)
- 堆内存空间:保存每个对象的具体属性内容。
- 全局数据区:保存static类型的属性。
- 全局代码区:保存所有的方法定义。
- 程序计数器
总的来说,JAVA的new的对象在堆中,引用变量在栈中;对应的,C++的new对象在堆中,对象指针变量在栈中;但是可以非new方法创建对象,对象在栈中,对象名只是一个名称,对应了某个内存位置,不占空间。
3、JAVA和C++的内存回收原理
无论是JAVA还是C#,都是通过根集(寄存器、程序栈、静态数据段中指针的集合)出发来找可达的指针

而C++的原生指针(raw pointer,即一般我们自己声明的指针)不受控制,所以一般不建议使用这种指针,而应使用智能指针。
智能指针有如下几种:std::auto_ptr,boost library的scoped_ptr、shared_ptr、weak_ptr、intrusive_ptr(不常见)。
其中,
1、auto_ptr所指向的对象在作用域之外会自动得到析构;不支持复制;
2、scoped_ptr与auto_ptr一致;但两者存在一个主要差别:auto_ptr特意被设计为指针的所有权是可转移的,可以再函数之间传递,同一时刻只能有一个auto_ptr指针;而scoped_ptr将拷贝构造函数和赋值函数都声明了私有,拒绝了指针所有权的转让从而保证了指针的绝对安全;
3、shared_ptr是通常理解的智能指针,shared_ptr中所实现的本质是引用计数(reference counting),也就是说shared_ptr是支持复制的,复制一个shared_ptr的本质是对这个智能指针的引用次数加1,而当这个智能指针的引用次数降低到0的时候,该对象自动被析构;
4、weak_ptr
[基础] C++与JAVA的内存管理的更多相关文章
- Java的内存管理与内存泄露
作为Internet最流行的编程语言之一,Java现正非常流行.我们的网络应用程序就主要采用Java语言开发,大体上分为客户端.服务器和数据库三个层次.在进入测试过程中,我们发现有一个程序模块系统内存 ...
- 让你第一次认识到Java的内存管理
发现之前写的可读性不好,这次准备试试换风格,去掉长篇大论,觉得这个风格好的,麻烦点个赞啦 清理.JVM的妙处 大家以后都是程序员,假设你很不幸,需要自己交钱租房子. 你作为一个小穷人,租的房子到期了( ...
- Java虚拟机内存管理机制
自动内存管理机制 Java虚拟机(JVM)在执行Java程序过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有的区 ...
- java Hotspot 内存管理白皮书(中文翻译)
转自: http://my.oschina.net/u/568779/blog/166891 1引言 一个健壮的 Java™2平台,Standard Edition (J2SE™)拥有一个自动内存管理 ...
- java HotSpot 内存管理白皮书
原文见:http://www.open-open.com/lib/view/open1381034220705.html.查阅资料后,对原文做了补充. 文中关于JVM的介绍基于JDK1.6的Hotsp ...
- Java自动内存管理机制学习(一):Java内存区域与内存溢出异常
备注:本文引用自<深入理解Java虚拟机第二版> 2.1 运行时数据区域 Java虚拟机在执行Java程序的过程中把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创 ...
- Java的内存管理机制之内存区域划分
各位,好久不见.先做个预告,由于最近主要在做Java服务端开发,最近一段时间会更新Java服务端开发相关的一些知识,包括但不限于一些读书笔记.框架的学习笔记.和最近一段时间的思考和沉淀.先从Java虚 ...
- java jvm内存管理/gc策略/参数设置
1. JVM内存管理:深入垃圾收集器与内存分配策略 http://www.iteye.com/topic/802638 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想 ...
- (三)java虚拟机内存管理和线程独占区和线程共享区
一.内存管理 二.线程独占区之程序计数器(Program Counter Register) 程序计数器是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里,字节 ...
随机推荐
- 控件AutoCompleteTextView实现动态匹配输入内容的一种输入框
<AutoCompleteTextView android:layout_width="match_parent" android:layout_height="w ...
- The performance between the 'normal' operation and the 'shift' operation.
First, I gonna post my test result with some code: //test the peformance of the <normal operation ...
- 菜鸟学开店—自带U盘的打印机
本文旨在提供最简单.便宜.有效的解决方案,解决普通用户最困扰的问题.今天提供普通用户一个低价的小票打印机驱动安装解决方案 相信很多用户都碰到过这种情况,电脑的重装了系统,打印机的驱动没有备份,要用打印 ...
- AFNETWORKING tabelView没有reloadData,报错unsupported URL
Error Domain=NSURLErrorDomain Code=-1002 "unsupported URL" UserInfo=0x7f9dc278aa60 {NSUnde ...
- 通用数据挖掘[ZZ]
一.什么是数据挖掘?许多人认为数据挖掘更像是一门哲学,或数学的组成部分,而不是业务需求的实际解决方案.您可以从采用的各种定义中看出这一点,例如:“数据挖掘是对非常大型的数据进行的研究和分析,采用自动或 ...
- pthread_setcanceltype 线程取消
取消线程: (1)一个线程可以调用pthread_cancel来取消另一个线程. (2)被取消的线程需要被join来释放资源. (3)被取消的线程的返回值为PTHREAD_CANCELED ...
- vijos P1055奶牛浴场&& Winter Camp2002
这道题是我在寒假的模拟赛里碰到的,现在想起来仍觉得余味无穷.题目大意大致如下:给你一个矩形并在其中划出一个最大的子矩形,当然,在这个矩形里有些地方是取不到的,也就是说我们划的这个子矩形不能包含这些点( ...
- 80端口被占用 PID = 4解决办法
请按照下面的步骤来运行命令:1. sc config http stat = demand2. reboot3. run the command(netsh http show servicestat ...
- js获取屏幕(设备)宽高
平常获取设备的宽高无非就那几 <script language="javascript"> var h = ""; h += " 网页可见 ...
- C#接收post数据
private string PostInput() { try { System.IO.Stream s=Request.InputStream; ; ]; StringBuilder builde ...