黑马程序员技术交流社区

标题: 字符串的内存管理 [打印本页]

作者: 第六天魔王    时间: 2013-12-21 20:48
标题: 字符串的内存管理
本帖最后由 第六天魔王 于 2013-12-23 13:13 编辑

字符串的内存管理是怎么样的?
作者: 一年之后    时间: 2013-12-21 21:14
是final的,一旦被建立,就不可以改变。
String str = “abc” ;
str = “bcd” ;
“abc”是不会变的。
作者: for    时间: 2013-12-21 21:39
每次对一个String对象进行操作时并不是真的对这个String对象的实例进行修改,而是返回一个新的String对象实例作为操作执行的结果
作者: 红鹰(Jake)    时间: 2013-12-21 22:50
字符串是应用类型,声明的时候是分配了一个内存空间,只对实列进行引用也就是存储一个地址,赋值的时候才真正给存储空间大小,占用内存。第一次赋值给多大就是多大的存储空间。
作者: 师弟    时间: 2013-12-21 23:43
字符串是不变性的,改变的只是新生成字符串的引用
作者: 卖火柴    时间: 2013-12-21 23:43
应该是可以解答你得疑问的了。


为字符串数据自定义内存分配方案的最简单的方式是使用 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;
}
}

作者: 诱惑灵魂    时间: 2013-12-22 18:35
首先字符串是string类型也就是引用类型。
引用类型的实例分配在堆上,并且传的是一个地址‘
如:
string a = "aaa";     // a----->new String("aaa")
string b = a;          //b----->a, 传引用
b = "bbb";            // b----->new String("bbb"), 传引用,其实是b指向了一个新的字符串,a并没有变

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




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2