解决方案 »

  1.   

    LZ你验证过了没有。
    我在VC6上验证没有错误,你的源码和VC6也不同。但是有一点是相同的pNewData->AddRef();使用相同的指针会增加引用计数,这样析构的时候就不会把还在使用的字符串也一起析构掉。我相信微软不会犯这种低级错误。
      

  2.   

    CString有一个陷阱是在多线程的使用上,至少在MFC4.0上是这样,不知道后面的版本有没有变。
      

  3.   

    两个CString赋值,都会有问题,那还怎么用?
    按照你的意思,别搞那么复杂,看别人的逻辑很累,简单点,这样会出错吗:CString str1;
    {
    CString str2 = "abcdefg";
    str1 = str2;
    }printf("%s\n", (LPCTSTR) str1); //use
      

  4.   


    只是说网络消息struct避免用指针和class
      

  5.   

    结构中只用基本类型,操作起来更放心,指针是一定要用的
    字符串,一般还是用TCHAR,LPTSTR之类的表示,以方便版本迁移
      

  6.   

    如果你在结构里使用了class,你就不能用ZeroMemory之类的初始化了
    如果要用到class,那么就不要使用struct,使用class更配套一些
      

  7.   

    确实可用,我用的是vs2010,经过调试,str2的m_pszData 地址:0x002eb4a8,值"abcdefg"
    str1得到后,地址跟str2一样!!!
    出了作用域了,因为没有别的操作覆盖掉0x002eb4a8,当然str1还是可用的。不过,这个应该变成了野指针了。我不知道vc6是否也是这个情况。
      

  8.   

    LPCTSTR p = _T("1234567");
    CString str1 = p;这样操作就没问题了!!
      

  9.   

    实践出真知
    ------------------------------------------------------AutoCSDN签名档------------------------------------------------------
      

  10.   

    引用 10 楼 hankcs 的回复:
    实践出真知
    ------------------------------------------------------AutoCSDN签名档------------------------------------------------------
      

  11.   

    else下面那一大串都没注意到么CString被无数人用了20多年了,可不会犯这么初级的错误。
      

  12.   

    纯属扯淡,也太小看MFC了,微软的那帮老头可不是吃素的
      

  13.   


    当然不是野指针,看析构函数
    CString::~CString()
    //  free any attached data
    {
    if (GetData() != _afxDataNil)
    {
    if (InterlockedDecrement(&GetData()->nRefs) <= 0)
    FreeData(GetData());
    }
    }
    在引用计数大于0的情况下是不会销毁那块空间的。
    不然的话岂不是连下面这样简单的代码都会有问题:....
    CString str1
    {
        CString str2 = "123";
        str1 = str2;
    }
    //继续使用str1
    ....
      

  14.   

    第一,别看不起人,你够资格进微软再说别的。
    第二,去查查引用计数是什么东西。
    第三,“写C程序的时候”?楼主真的分得清C和C++吗?
      

  15.   

    第一,我没有看不起人,技术领域,没有谁看不起谁之说,只是纯粹技术上的讨论。哪怕是错误的东西,只要能够讨论透了,都是好事情。我想,这是每个人学习过程中必经的路。很多初学者,就是怕提问一些幼稚的问题,导致提升很慢。所以,这跟是否看不起人没关系。
    第二,非常感谢你的提醒,我跟踪的时候,确实注意到了计数,但没有进一步看析构函数。
    第三,我确实分不清c跟c++,但并不妨碍我的意思的表达,你说呢?另:我的程序中,确实出现了计数为0,导致被析构的情况,才引出了上述的疑问,非常感谢大家的讨论。
    LZ的精神值得鼓励,LZ的勇气更值得赞赏。当然以后你验证的时候需要更严谨一些。另外你那个“计数为0”的例子也可以拿出来讨论一下。