AnsiString研究(AnsiString内的引用计数器),该怎么解决
AnsiString研究(AnsiString内的引用计数器)
VCL的AnsiString看似简单实际远比CString复杂。
AnsiString实际可分解为以下结构:
struct StrData
{
int Ref; //引用计数
int Size;//数据大小
char Data[];//实际的数据 是按4字节对齐的
};
struct AnsiString
{
StrData *PData;//数据指针
};
对于 AnsiString Str;
一销毁:delete Str 或 Str = " ";或Str.Length();
if(PData)
{
if(--PData-> Ref==0)
{
delete[] (int)PData;
}
PData = NULL;
}
二赋值 "12345678 ":
if(PData==NULL)
{
PData = new int[sizeof(StrData)+(Size+1+3)/4];//+1是补 '\0 ',+3是对齐4字节
PData-> Ref = 1;
PData-> Size = Size;
CopyMemory(PData-> Data,Buf,Size+1);];//+1是补 '\0 '
}
else
{
if(PData-> Ref==1)
{
销毁并重建PData
}
else
{
PData-> Ref--;
//重新构造PData
PData = new int[sizeof(StrData)+(Size+1+3)/4];
PData-> Ref = 1;
PData-> Size = Size;
CopyMemory(PData-> Data,Buf,Size+1);];//+1是补 '\0 '
}
}
三赋值AnsiString:
if(PData==NULL)
{
PData = new int[sizeof(StrData)+(Size+1+3)/4];//+1是补 '\0 '+3是对齐4字节
PData-> Ref = 1;
PData-> Size = Size;
CopyMemory(PData-> Data,Buf,Size+1);];//+1是补 '\0 '
}
else
{
PData-> Ref++;
}
四修改:if(PData-> Ref> 1)
{
PData-> Ref--;
PData = 重建
...
}
else
{
...
}
------解决方案--------------------
VCL的AnsiString看似简单实际远比CString复杂。
AnsiString实际可分解为以下结构:
struct StrData
{
int Ref; //引用计数
int Size;//数据大小
char Data[];//实际的数据 是按4字节对齐的
};
struct AnsiString
{
StrData *PData;//数据指针
};
对于 AnsiString Str;
一销毁:delete Str 或 Str = " ";或Str.Length();
if(PData)
{
if(--PData-> Ref==0)
{
delete[] (int)PData;
}
PData = NULL;
}
二赋值 "12345678 ":
if(PData==NULL)
{
PData = new int[sizeof(StrData)+(Size+1+3)/4];//+1是补 '\0 ',+3是对齐4字节
PData-> Ref = 1;
PData-> Size = Size;
CopyMemory(PData-> Data,Buf,Size+1);];//+1是补 '\0 '
}
else
{
if(PData-> Ref==1)
{
销毁并重建PData
}
else
{
PData-> Ref--;
//重新构造PData
PData = new int[sizeof(StrData)+(Size+1+3)/4];
PData-> Ref = 1;
PData-> Size = Size;
CopyMemory(PData-> Data,Buf,Size+1);];//+1是补 '\0 '
}
}
三赋值AnsiString:
if(PData==NULL)
{
PData = new int[sizeof(StrData)+(Size+1+3)/4];//+1是补 '\0 '+3是对齐4字节
PData-> Ref = 1;
PData-> Size = Size;
CopyMemory(PData-> Data,Buf,Size+1);];//+1是补 '\0 '
}
else
{
PData-> Ref++;
}
四修改:if(PData-> Ref> 1)
{
PData-> Ref--;
PData = 重建
...
}
else
{
...
}
------解决方案--------------------