怎么快速实现两CString对象的快速复制?
例如
CString p("abcd");
CString q;//q=p;//这里指向同一内存块,所以我要COPY出来for(int i=0;i<p.GetLength();i++)
{
if(p.GetAt(i)!='\0')
q=q+p.GetAt(i);
}//太麻烦了,如果串较长而且复制操作较多的话,很影响性能
//所以我想请问各位高手,是不是有什么好的办法?

解决方案 »

  1.   

    用CString的话直接赋值就行了
    不推荐用CString,很不好用,经常会出些莫名其妙的问题,特别是涉及指针的时候
    不如用char*好点
      

  2.   

    楼上的几位请看
    CString Q;
    {
    CString p("abcd");
    Q=p;
    }
    ......现在的Q是什么?有可能是abcd,也有可能不是,原因我想大家都明白
    所以我才要重新将p指向的内存块复制一份到Q
      

  3.   

    CString好像是用引用计数来控制内存块的生存周期的,operator=因该使引用计数+1。
      

  4.   

    CString str1="abc";
    CString str2=CString(str1);
    用构造复制函数可以了吧!
    我试过了,很爽
    在这里不要跟我谈什么效率的问题
      

  5.   

    CString Q;
    {
    CString p("abcd");
    Q=p;
    }
    这有什么问题吗?
    一点问题都没有,=号用的就是内存复制的方式
    给大家贴一段MFC的CStringr的重载操作符代码
      

  6.   

    const CString& CString::operator=(const CString& stringSrc)
    {
    if (m_pchData != stringSrc.m_pchData)
    {
    if ((GetData()->nRefs < 0 && GetData() != _afxDataNil) ||
    stringSrc.GetData()->nRefs < 0)
    {
    // actual copy necessary since one of the strings is locked
    AssignCopy(stringSrc.GetData()->nDataLength, stringSrc.m_pchData);
    }
    else
    {
    // can just copy references around
    Release();
    ASSERT(stringSrc.GetData() != _afxDataNil);
    m_pchData = stringSrc.m_pchData;
    InterlockedIncrement(&GetData()->nRefs);
    }
    }
    return *this;
    }
      

  7.   

    对!如楼上说的,Q=p绝对没问题,大家也不用怀疑CString绝对好使,比得上BCB中的AnsiString,大家就放心使用吧!(秘技:把它当成int类型那样使用,不用再考虑什么复制释放的问题了,爽!)
      

  8.   

    确实是没有复制,我跟踪过了,只是执行=一次的话,引用会增加一次,相应的会减少引用,不会存在引用局部无效地址的问题,就好象DLL,COM的引用一样
    m_pchData是一个共用的(堆分配)的变量,我没有出问题,我觉得CString是VC最好用,和用得最多的一个类!
      

  9.   

    CString 变量从文件中读取数据时常出毛病对于你的问题:
    可以这样:q.Format("%s", p);
      

  10.   

    不知道大家试过类的公有CString变量去“=”一个类的函数的局部变量的结果没有?