A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 第六天魔王 中级黑马   /  2013-12-21 20:48  /  1337 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 第六天魔王 于 2013-12-23 13:13 编辑

字符串的内存管理是怎么样的?

评分

参与人数 1技术分 +1 收起 理由
茹化肖 + 1

查看全部评分

6 个回复

倒序浏览
是final的,一旦被建立,就不可以改变。
String str = “abc” ;
str = “bcd” ;
“abc”是不会变的。

评分

参与人数 1技术分 +1 收起 理由
茹化肖 + 1

查看全部评分

回复 使用道具 举报
for 中级黑马 2013-12-21 21:39:54
藤椅
每次对一个String对象进行操作时并不是真的对这个String对象的实例进行修改,而是返回一个新的String对象实例作为操作执行的结果

评分

参与人数 1技术分 +1 收起 理由
茹化肖 + 1

查看全部评分

回复 使用道具 举报
字符串是应用类型,声明的时候是分配了一个内存空间,只对实列进行引用也就是存储一个地址,赋值的时候才真正给存储空间大小,占用内存。第一次赋值给多大就是多大的存储空间。

评分

参与人数 1技术分 +1 收起 理由
茹化肖 + 1

查看全部评分

回复 使用道具 举报
师弟 来自手机 中级黑马 2013-12-21 23:43:17
报纸
字符串是不变性的,改变的只是新生成字符串的引用
回复 使用道具 举报
应该是可以解答你得疑问的了。


为字符串数据自定义内存分配方案的最简单的方式是使用 ATL 提供的 CAtlStringMgr 类,但您需要自己提供内存分配例程。CAtlStringMgr 的构造函数采用单一参数:即指向 IAtlMemMgr 对象的指针。IAtlMemMgr 是提供到堆的一般接口的抽象基类。通过 IAtlMemMgr 接口,CAtlStringMgr 分配、重新分配和释放用于存储字符串数据的内存。您既可以自已实现 IAtlMemMgr 接口,也可以使用由 ATL 提供的五个内存管理器类之一。ATL 提供的内存管理器只包装现有的内存分配功能:
CCRTHeap   包装标准 CRT 堆功能(malloc、free 和 realloc)
CWin32Heap   使用 HeapAlloc、HeapFree 和 HeapRealloc 包装 Win32 堆句柄
CLocalHeap   包装 Win32 API:LocalAlloc、LocalFree 和 LocalRealloc
CGlobalHeap   包装 Win32 API:GlobalAlloc、GlobalFree 和 GlobalRealloc
CComHeap   包装 COM 任务分配器 API:CoTaskMemAlloc、CoTaskMemFree 和 CoTaskMemRealloc
要进行字符串内存管理,最有用的类是 CWin32Heap,因为它使您能够创建多个独立的堆。例如,如果使用仅用于字符串的独立堆,可进行以下操作:
//Declare a thread-safe, growable, private heap with initial size 0
CWin32Heap g_stringHeap( 0, 0, 0 );
// Declare a string manager that uses the private heap
CAtlStringMgr g_stringMgr( &g_stringHeap );
要使用此专用的字符串管理器来管理 CString 变量的内存,请将一个指针传递给管理器作为 CString 变量的构造函数的一个参数:
void PrintPowers( int nBase )
{
   int n = 1;
   for( int nPower = 0; nPower < 10; nPower++ )
{
   // Use the private string manager, instead of the default
   CString strPower( &g_stringMgr );
   strPower.Format( "%d", n );
   printf( "%s\n", LPCSTR( strPower ) );
   n *= nBase;
}
}

评分

参与人数 1技术分 +1 收起 理由
茹化肖 + 1

查看全部评分

回复 使用道具 举报
首先字符串是string类型也就是引用类型。
引用类型的实例分配在堆上,并且传的是一个地址‘
如:
string a = "aaa";     // a----->new String("aaa")
string b = a;          //b----->a, 传引用
b = "bbb";            // b----->new String("bbb"), 传引用,其实是b指向了一个新的字符串,a并没有变

他们是共同指向同一个内存空间的

评分

参与人数 1技术分 +1 收起 理由
茹化肖 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马