用在一个系统里用了
CString buf;
int i;
buf.Format("%d",i);
在用的时候i是赋了值的。但是运行中会出错。
请问该怎么修改才可以提高它的稳定性。或者如果拦截这样的错误?
如改成
char buf[256];
int i;
springf(buf,"%d",i);
又会怎样?
谢谢。

解决方案 »

  1.   

    CString buf;
    int i;
    buf.Format("%d",i);
    是不会错的啊 
    char buf[256];
    int i;
    springf(buf,"%d",i);
    也不会有什么问题 数字的长度不会大于256的
      

  2.   

    一般情况下Format不会出错,起码来说我还没遇到过!
    如过不想用的话,用你写的第二种形式也是不错的!
      

  3.   

    这个错误是偶尔产生的。
    系统提示D:\Program Files\Microsoft Visual Studio\VC98\MFC\SRC\STRCORE.CPP
    498行出错。
    我查STRCORE.CPP是
    ///////////////////////////////////////////////////////////////////////////////
    // Advanced direct buffer accessLPTSTR CString::GetBuffer(int nMinBufLength)
    {
    ASSERT(nMinBufLength >= 0); if (GetData()->nRefs > 1 || nMinBufLength > GetData()->nAllocLength)
    {
    #ifdef _DEBUG
    // give a warning in case locked string becomes unlocked
    if (GetData() != _afxDataNil && GetData()->nRefs < 0)
    TRACE0("Warning: GetBuffer on locked CString creates unlocked CString!\n");
    #endif
    // we have to grow the buffer
    CStringData* pOldData = GetData();
    int nOldLen = GetData()->nDataLength;   // AllocBuffer will tromp it
    if (nMinBufLength < nOldLen)
    nMinBufLength = nOldLen;
    AllocBuffer(nMinBufLength);
    memcpy(m_pchData, pOldData->data(), (nOldLen+1)*sizeof(TCHAR));
    GetData()->nDataLength = nOldLen;
    CString::Release(pOldData);
    }
    //*******************
    ASSERT(GetData()->nRefs <= 1);//出错行
    //*********************
    // return a pointer to the character storage for this string
    ASSERT(m_pchData != NULL);
    return m_pchData;
    }
    我不知在我程序中是如何做产生了这样的错误。
    请各位看看,我真的不希望我的程序存在太多BUG了。
      

  4.   

    你的程序出错干麻把mfc的代码贴出来?
      

  5.   

    只要没有语法错误一般没问题,比如用%d接收double等
      

  6.   

    CString的Format()是不可能有问题的,你是否调用了GetBuffer()而没有ReleaseBuffer(),或者线程没有同步。
      

  7.   

    错误一般都是由自己的代码引起的,
    毕竟MFC作为一个产品卖了那么久。
      

  8.   

    fomat本身应该没有错误,只要使用上多加注意
      

  9.   

    CString GetBuffer
    后必须ReleaseBuffer吗
      

  10.   

    如果你要是修改了buffer里的内容就要release。
    搂主的错误好像是有人在调用这个buffer中的数据。应为引用数大于1,所以说明除了format以外还有人在访问该CString中的数据。逻辑上这时的数据是受保护的,所以getbuffer这样危险的操作就会被禁止,所以报错。
      

  11.   

    是这样,我贴出MFC是为了大家告诉我我的程序是如何做而产生了这样的错误。
    我的程序是几个线程对几个CString变量赋值,而有一个线程会不断将这些CString变量赋值给另一些变量。
    请教各位,如果我不改几个对CString变量赋值线程,在取这些CString变量的线程里能不能通过什么东西判断改CSting变量可不可以赋值给别的变量。
    分不够我在加。
      

  12.   

    VOID InitializeCriticalSection(
      LPCRITICAL_SECTION lpCriticalSection   // address of critical 
                                             // section object
    );VOID EnterCriticalSection(
      LPCRITICAL_SECTION lpCriticalSection   // pointer to critical 
                                             // section object
    );
    VOID LeaveCriticalSection(
      LPCRITICAL_SECTION lpCriticalSection   // address of critical 
                                             // section object
    );
      

  13.   

    请原谅,我不晓得如何跟我的CSting加上临界区。
    请各位大哥写个源码给我好不好,谢谢了。
      

  14.   

    应该不用使用临界区,你好好检查一下你的代码吧,你也可以试试不以CString 转换直接传递你的变量,直接用int传递看看还有没有错误,传递过去在转化也不晚。
      

  15.   

    是这样,我有几个线程,每个线程有一CString变量,用来存放线程当前状态。
    有一个定时器,定时将这些状态显示到界面上。
    这样就产生了我在上面说的问题,我要完成这样的功能该这么来做比较安全勒?
      

  16.   

    典型的多线程互斥问题。
    应用CCriticalSection类。在存储状态和读取状态时设定临界区。
    如:
    CCriticalSection cLock;
    CString Stat;
    ...
    cLock.Lock();
    Stat = "Busy!";
    cLock.Unlock();
    ...
    cLock.Lock();
    CString Temp = Stat;
    cLock.Unlock();
    ...
      

  17.   

    i只是被初始化了,应该给i赋值。
    CString::Format()挺好用的