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
{
...
}
------解决方案--------------------
啊?
{
AnsiString sz = " ";
}
出了这个语句块,sz应该释放了吧?因为sz是栈上的吧?
如果是用new分配 delete sz 或 sz = " ";或sz.SetLength(0);
FFSB是这个意思?
[解决办法]
学习~
[解决办法]
现在很多字符串都使用引用计数
[解决办法]
....
[解决办法]
学习了,楼主继续
[解决办法]
学习
[解决办法]
uP
学习
[解决办法]
对象也可以直接delete?