CStringData 类

此类表示字符串对象的数据。

语法

struct CStringData

成员

方法

名称 描述
AddRef 递增字符串数据对象的引用计数。
data 检索字符串对象的字符数据。
IsLocked 确定关联字符串对象的缓冲区是否已锁定。
IsShared 确定关联字符串对象的缓冲区当前是否已共享。
锁定 锁定关联字符串对象的缓冲区。
版本 释放指定的字符串对象。
Unlock 解锁关联字符串对象的缓冲区。

数据成员

名称 描述
nAllocLength XCHAR 中的分配数据的长度(不包括结尾 null)
nDataLength XCHAR 中当前使用的数据的长度(不包括结尾 null)
nRefs 对象的当前引用计数。
pStringMgr 指向此字符串对象的字符串管理器的指针。

备注

此类只能由实现自定义字符串管理器的开发人员使用。 有关自定义字符串管理器的详细信息,请参阅内存管理和 CStringT

此类封装与较高字符串对象(例如 CStringTCSimpleStringTCFixedStringT 对象)关联的信息和数据的各种类型。 每个较高字符串对象包含一个指向其关联 CStringData 对象的指针,允许多个字符串对象指向同一个字符串数据对象。 这种关系由 CStringData 对象的引用计数 (nRefs) 表示。

注意

在某些情况下,字符串类型(例如 CFixedString)不会与多个较高字符串对象共享字符串数据对象。 有关详细信息,请参阅内存管理和 CStringT

此数据由以下部分组成:

  • 字符串的内存管理器(类型为 IAtlStringMgr)。

  • 字符串的当前长度 (nDataLength)。

  • 字符串的分配长度 (nAllocLength)。 出于性能原因,这可能与当前字符串长度不同

  • CStringData 对象的当前引用计数 (nRefs)。 此值用于确定有多少个字符串对象共享同一个 CStringData 对象。

  • 字符串的实际字符缓冲区 (data)。

    注意

    字符串对象的实际字符缓冲区由字符串管理器分配,并追加到 CStringData 对象。

要求

标头:atlsimpstr.h

CStringData::AddRef

递增字符串对象的引用计数。

void AddRef() throw();

注解

递增字符串对象的引用计数。

注意

不要对引用计数为负的字符串调用此方法,因为负计数表示字符串缓冲区已锁定。

CStringData::data

返回指向字符串对象的字符缓冲区的指针。

void* data() throw();

返回值

指向字符串对象的字符缓冲区的指针。

备注

调用此函数可返回关联字符串对象的当前字符缓冲区。

注意

此缓冲区不是由 CStringData 对象分配的,而是由字符串管理器按需分配的。 分配后,缓冲区将追加到字符串数据对象。

CStringData::IsLocked

确定字符缓冲区是否已锁定。

bool IsLocked() const throw();

返回值

如果缓冲区已锁定,则返回 TRUE;否则返回 FALSE。

备注

调用此函数可确定字符串对象的字符缓冲区当前是否已锁定。

CStringData::IsShared

确定字符缓冲区是否已共享。

bool IsShared() const throw();

返回值

如果缓冲区已共享,则返回 TRUE;否则返回 FALSE。

注解

调用此函数可确定字符串数据对象的字符缓冲区当前是否在多个字符串对象之间共享。

CStringData::Lock

锁定关联字符串对象的字符缓冲区。

void Lock() throw();

备注

调用此函数可锁定字符串数据对象的字符缓冲区。 当开发人员需要直接访问字符缓冲区时,可使用锁定和解锁。 CSimpleStringTLockBufferUnlockBuffer 方法演示了一个很有代表性的锁定示例。

注意

仅当缓冲区未在较高字符串对象之间共享时,才能锁定字符缓冲区。

CStringData::nAllocLength

分配的字符缓冲区的长度。

int nAllocLength;

注解

将分配的数据缓冲区的长度存储在 XCHAR 中(不包括结尾 null)。

CStringData::nDataLength

字符串对象的当前长度。

int nDataLength;

注解

将当前使用的数据的长度存储在 XCHAR 中(不包括结尾 null)。

CStringData::nRefs

字符串数据对象的引用计数。

long nRefs;

备注

存储字符串数据对象的引用计数。 此计数表示与字符串数据对象关联的较高字符串对象的数量。 负值表示字符串数据对象当前已锁定。

CStringData::pStringMgr

关联的字符串对象的内存管理器。

IAtlStringMgr* pStringMgr;

备注

存储关联字符串对象的内存管理器。 有关内存管理器和字符串的详细信息,请参阅内存管理和 CStringT

CStringData::Release

递减字符串数据对象的引用计数。

void Release() throw();

备注

调用此函数可递减引用计数,如果引用计数为零,则释放 CStringData 结构。 此操作通常在删除字符串对象时完成,因此不再需要引用字符串数据对象。

例如,以下代码针对与 str1 关联的字符串数据对象调用 CStringData::Release

{
   CString str1 = _T("Hello world");  // Allocates new CStringData
}
// str1 is deleted when it goes out of scope, so it releases its string data   

CStringData::Unlock

解锁关联字符串对象的字符缓冲区。

void Unlock() throw();

注解

调用此函数可解锁字符串数据对象的字符缓冲区。 解锁某个缓冲区后,该缓冲区可共享,并可用作引用计数对象。

注意

每个 Lock 调用必须由相应的 Unlock 调用匹配。

当开发人员必须确保字符串数据不会共享时,可以使用锁定和解锁。 CSimpleStringTLockBufferUnlockBuffer 方法演示了一个很有代表性的锁定示例。

另请参阅

层次结构图
ATL/MFC 共享类