黑马程序员技术交流社区
标题:
字符串的内存管理
[打印本页]
作者:
第六天魔王
时间:
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