首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

AnsiString研究(AnsiString内的引用计数器),该怎么解决

2012-03-09 
AnsiString研究(AnsiString内的引用计数器)VCL的AnsiString看似简单实际远比CString复杂。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
            {
                ...
            }

------解决方案--------------------


啊?
{
AnsiString sz = " ";
}

出了这个语句块,sz应该释放了吧?因为sz是栈上的吧?

如果是用new分配 delete sz 或 sz = " ";或sz.SetLength(0);

FFSB是这个意思?
[解决办法]
学习~
[解决办法]
现在很多字符串都使用引用计数
[解决办法]
....
[解决办法]
学习了,楼主继续
[解决办法]
学习
[解决办法]
uP
学习
[解决办法]
对象也可以直接delete?

热点排行