在Visual C++6.0 MFC中,CString是否可以像简单类型而不是类一样安全地处理

Can a CString be safely treated like it was a simple type and not a class, in Visual C++ 6.0 MFC?

本文关键字:处理 安全 一样 类型 简单 MFC C++6 Visual CString 是否      更新时间:2023-10-16

不幸的是,我的文档要么是(a)没有任何errrata的原始产品文档(MS VC++6.0帮助文件),要么是(b)适用于更高MFC版本的更高MSDN帮助。

特别是:

[Q1]是否已知VC++6 MFCCString中的运算符+=存在错误?这段来自VC++6的代码在现代MFC应用程序中编译之前必须进行修复:

CString szTemp;
unsigned char m_chReceive[MY_BUF_SIZE];
// compiles and seems to run but may be buggy in VC++6, won't compile in modern MFC
szTemp += m_chReceive; 
// the above won't compile in modern MFC versions, but this "&+cast" does:
szTemp.Append( (const char *)&m_chReceive[0]); 

[Q2]以这种方式作为函数的结果返回CString是否安全可靠,或者这会导致内存损坏?

CString MyClass:MyMethod(void)
{   CString Stuff;
// set a value to Stuff here.
return Stuff; // return a stack-allocated-CString 
}

我的代码到处都在使用以上两种东西,而且似乎还表现出随机的运行时内存损坏。这两件事对我来说是危险信号,我怀疑CString是Visual C++6.0中MFC的作者想要的,它是一个很好的简单的东西,你可以像使用intchar类型一样使用它,并从函数返回它,以某种方式复制构造函数和内存管理,这一切都刚刚奏效了吗?

显而易见的东西:是的,当然我会在可能的时候把我所有的代码都从VC++6.0中删除,但我首先需要修补一个正在崩溃的生产系统,然后我就可以开始推进这个遗留代码库的巨大任务了。

根据VC6.0 的文档

CString对象可以由于串联操作而增长。CString对象遵循"值语义">

Microsoft文档似乎表明CString在目的上与std::string相似,因为它在需要时会自动增长,并且可以安全地作为参数或函数的返回值传递。