用CString的Format()是否稳定?

wenddy112 2003-11-08 04:11:58
用在一个系统里用了
CString buf;
int i;
buf.Format("%d",i);
在用的时候i是赋了值的。但是运行中会出错。
请问该怎么修改才可以提高它的稳定性。或者如果拦截这样的错误?
如改成
char buf[256];
int i;
springf(buf,"%d",i);
又会怎样?
谢谢。
...全文
457 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
0x191 2003-11-11
  • 打赏
  • 举报
回复
i只是被初始化了,应该给i赋值。
CString::Format()挺好用的
ManFred2ManFred 2003-11-11
  • 打赏
  • 举报
回复
典型的多线程互斥问题。
应用CCriticalSection类。在存储状态和读取状态时设定临界区。
如:
CCriticalSection cLock;
CString Stat;
...
cLock.Lock();
Stat = "Busy!";
cLock.Unlock();
...
cLock.Lock();
CString Temp = Stat;
cLock.Unlock();
...
wenddy112 2003-11-11
  • 打赏
  • 举报
回复
是这样,我有几个线程,每个线程有一CString变量,用来存放线程当前状态。
有一个定时器,定时将这些状态显示到界面上。
这样就产生了我在上面说的问题,我要完成这样的功能该这么来做比较安全勒?
wenddy112 2003-11-10
  • 打赏
  • 举报
回复
没人来啊?
fingerfox 2003-11-10
  • 打赏
  • 举报
回复
MFC不是线程安全的确:)
ayanamiwww 2003-11-10
  • 打赏
  • 举报
回复
应该不用使用临界区,你好好检查一下你的代码吧,你也可以试试不以CString 转换直接传递你的变量,直接用int传递看看还有没有错误,传递过去在转化也不晚。
duyhui 2003-11-10
  • 打赏
  • 举报
回复
错误可能是因为你的i没有赋值的原因,其它的应该没问题的
wenddy112 2003-11-09
  • 打赏
  • 举报
回复
请原谅,我不晓得如何跟我的CSting加上临界区。
请各位大哥写个源码给我好不好,谢谢了。
huanyun 2003-11-09
  • 打赏
  • 举报
回复
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
);

huanyun 2003-11-09
  • 打赏
  • 举报
回复
使用临界区吧 为你的字符串操作加上互斥
wenddy112 2003-11-09
  • 打赏
  • 举报
回复
是这样,我贴出MFC是为了大家告诉我我的程序是如何做而产生了这样的错误。
我的程序是几个线程对几个CString变量赋值,而有一个线程会不断将这些CString变量赋值给另一些变量。
请教各位,如果我不改几个对CString变量赋值线程,在取这些CString变量的线程里能不能通过什么东西判断改CSting变量可不可以赋值给别的变量。
分不够我在加。
ManFred2ManFred 2003-11-08
  • 打赏
  • 举报
回复
如果你要是修改了buffer里的内容就要release。
搂主的错误好像是有人在调用这个buffer中的数据。应为引用数大于1,所以说明除了format以外还有人在访问该CString中的数据。逻辑上这时的数据是受保护的,所以getbuffer这样危险的操作就会被禁止,所以报错。
dzqsuper 2003-11-08
  • 打赏
  • 举报
回复
CString GetBuffer
后必须ReleaseBuffer吗
ablefirst 2003-11-08
  • 打赏
  • 举报
回复
fomat本身应该没有错误,只要使用上多加注意
fingerfox 2003-11-08
  • 打赏
  • 举报
回复
错误一般都是由自己的代码引起的,
毕竟MFC作为一个产品卖了那么久。
gomi 2003-11-08
  • 打赏
  • 举报
回复
CString的Format()是不可能有问题的,你是否调用了GetBuffer()而没有ReleaseBuffer(),或者线程没有同步。
bluebohe 2003-11-08
  • 打赏
  • 举报
回复
只要没有语法错误一般没问题,比如用%d接收double等
BinaryTreeEx 2003-11-08
  • 打赏
  • 举报
回复
你的程序出错干麻把mfc的代码贴出来?
keiven 2003-11-08
  • 打赏
  • 举报
回复
是啊 ,上面那函数用的没错啊,至少我是没碰到过.你说你运行是出了错误可能是其他的地方出了错误了,你认真检查一下.
wenddy112 2003-11-08
  • 打赏
  • 举报
回复
这个错误是偶尔产生的。
系统提示D:\Program Files\Microsoft Visual Studio\VC98\MFC\SRC\STRCORE.CPP
498行出错。
我查STRCORE.CPP是
///////////////////////////////////////////////////////////////////////////////
// Advanced direct buffer access

LPTSTR 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了。
加载更多回复(2)

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧