本人从事.net开发快两年了,一直认为鄙人的C++基础还是很扎实的,并且对Windows操作系统也有一定认识(Linux系就真比较少用),刚毕业的时候,也曾经经常研究游戏破解之类的小外挂,那时候真是折腾得津津有味啊,还记得在学校的时候,还没听过

“wifi破解”之类的互联网思维制造出来的蹭网神器,当时使用的是BT(back/track)和奶瓶两个Linux系的小型操作系统来破解的,当时玩得不亦乐乎,不扯了,入正题:

  .net框架的数据类型就分两种:值类型和引用类型。值类型的值就直接保存栈上面,该变量的作用于完了,其所占用的占内存就自动释放了,这没什么好说的。

  对于引用类型,其内存分配是在堆上完成的,栈上面也需要空间类保存指向堆上所分配内存的地址,其在栈上面所分配的用来存地址的内存会在其作用域完了之后自动释放,但是堆上为他分配的内存不会自动释放。总的来说,栈上面的内存使用比较频繁,分配和释放效率都很高,但是其宗的大小也比较小,一般用于小量内存的分配,因为系统对线程栈的大小是有限制的,但是对于堆的大小是没限制的。栈和堆的相关知识在后面再写一篇文章。

  string也是属于引用类型,由于string类型是我们最常用的类型,微软基于对内存和性能的考虑,对string类型增加了其他应用类型没有的特性;string具有驻留性和恒定性,怎么理解呢?驻留性就是说,string类型的常量(注意是常量)一旦定义了,就会一直驻留在内存里面,不会GC回收,而string变量是不具有驻留性的。那恒定性怎么理解呢,恒定性就是string(注意,并非要求是常量,string变量也是这样)一旦定义了,就不会被改变,对其的一些操作会单独生成多一个字符串,例如:

  

string str = "abc";
str = str+"d";
string str2 = "abc";

这样,内存里面就会存在abc和abcd两个字符串,第二个把两个字符串连起来的语句不会对原来的字符串做出改变,而是另外开辟多一块内存来存这个。根据string的驻留性,“abc”会一直驻留在内存里面,而abcd不会一直驻留在内存里面,超出了作用域GC就会把"abcd"回收。所以,如果某个字符串需要不断的动态相加的,建议使用StringBuilder。为什么要赋予string这两个特性呢,是因为string的使用频率太高了,这样反而可以节省内存,相同的字符串常量在内存里面只会存在一份,如果有相同的话,则是共享一块内存的。其实.Net中会自动维护一个常量池,里面用于存放静态常量和字符串常量,这个常量池是不受GC管理的,不会释放的,除非进程结束。

  注意,在.net中,一个引用对象的创建都要通过new来创建的,除了string,string是通过“”来创建一个对象的,所以在java中string str = new string("dd"),这样是创建了两个对象的。

  string通过不同的方式定义,产生的效果也不一样(详细请看:http://www.cnblogs.com/artech/archive/2007/03/04/663728.aspx);

string内存管理的更多相关文章

  1. iOS: ARC & MRC下string内存管理策略探究

    ARC & MRC下string内存管理策略探究 前两天跟同事争论一个关于NSString执行copy操作以后是否会发生变化,两个人整了半天,最后写代码验证了一下,发现原来NSString操作 ...

  2. string的内存管理问题

    string的内存管理是通过仅仅增不减的方式进行的,string的clear方法不会真正的释放内存,假设须要真正的释放内存可以连续调用string的这两个方法.resize(0),reserve(). ...

  3. C/C++(C++内存管理,内联函数,类型转换,命名空间,string类)

    ---恢复内容开始--- 内存管理 new/delete C语言中提供了 malloc 和 free 两个系统函数,#include "stdlib.h"库函数,完成对堆内存的申请 ...

  4. .NET基础拾遗(1)类型语法基础和内存管理基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基 ...

  5. cocos2d-x内存管理

    Cocos2d-x内存管理 老师让我给班上同学讲讲cocos2d-x的内存管理,时间也不多,于是看了看源码,写了个提纲和大概思想 一.   为什么需要内存管理 1. new和delete 2. 堆上申 ...

  6. Swift中的可选链与内存管理(干货系列)

    干货之前:补充一下可选链(optional chain) class A { var p: B? } class B { var p: C? } class C { func cm() -> S ...

  7. jvm--3.内存管理

    5.JVM内存管理 JAVA虚拟机在执行java程序的过程中,会把它管理的内存分成若干个不同的数据区域. ----------------------------------------------- ...

  8. Object-c 内存管理

                    内存管理 主要内容 1.内存管理的概念 2.引用计数 3.如何持有对象所有权 4.自动释放池 5.@property的使用 什么是内存管理 内存管理是关于如何管理对象生 ...

  9. iOS开发系列—Objective-C之内存管理

    概述 我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是由系统自己管理的,放在栈上).如果一个对象创建并使用后没 ...

随机推荐

  1. spring mvc Spring Data Redis RedisTemplate [转]

    http://maven.springframework.org/release/org/springframework/data/spring-data-redis/(spring-data包下载) ...

  2. 【点滴积累】通过特性(Attribute)为枚举添加更多的信息

    转:http://www.cnblogs.com/IPrograming/archive/2013/05/26/Enum_DescriptionAttribute.html [点滴积累]通过特性(At ...

  3. android88 录音机

    package com.itheima.recorder; import android.os.Bundle; import android.app.Activity; import android. ...

  4. Spring – Sending E-Mail Via Gmail SMTP Server With MailSender--reference

    Spring comes with a useful ‘org.springframework.mail.javamail.JavaMailSenderImpl‘ class to simplify ...

  5. 怎么在AptanaStudio中把电脑中的浏览器设置为默认执行方法

    1.在Aptana中找到按钮 2.点击向下的三角形找到

  6. tomcat中设置多项目共享jar;类包

    随着服务器上的tomcat部署的项目越来越多,最近在部署一个新的项目的时候出现内存溢出的错误 Exception in thread "main" java.lang.OutOfM ...

  7. Hibernate注解错误之- org.hibernate.MappingException: Could not determine type for:

    Hibernate 注解 @OneToOne 时候,出现以下错误,经调试,发现 注解要么全部放在字段上,要么全部放在get方法上,不能混合使用! org.hibernate.MappingExcept ...

  8. MVC小系列(十三)【全局异常处理与异常日志】

    在MVC网站的global.asax中的Application_Start方法里,有这样一段代码 protected void Application_Start() { //它的主要作用是将全局过滤 ...

  9. SqlServer 由于未在SqlServer的此实例上安装复制组件解决方法

    sqlserver2005在复制订阅时出现: “由于未在SqlServer的此实例上安装复制组件,Microsoft SQL server 无法访问这些组件,请参阅SQL Server……” 解决方法 ...

  10. 对比iOS中的四种数据存储

    来自于大牛的文章给大家分享下 :http://www.infoq.com/cn/articles/data-storage-in-ios/