在 Visual C++ 6.0 MFC 中,CString 是不是可以像简单类型而不是类一样被安全地对待?
Posted
技术标签:
【中文标题】在 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?在 Visual C++ 6.0 MFC 中,CString 是否可以像简单类型而不是类一样被安全地对待? 【发布时间】:2012-12-15 17:09:55 【问题描述】:不幸的是,我拥有的文档要么是 (a) 没有任何错误的原始产品文档(MS VC++ 6.0 帮助文件),要么是 (b) 适用于更高 MFC 版本的更高 MSDN 帮助。
特别是:
[Q1] 运算符 +=
在 VC++6 MFC CString
中是否存在漏洞? 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 的作者设计的,它是一个很好的简单的东西,你可以像 int
或 char
类型一样使用它,并从函数中返回它并以某种方式复制构造函数和内存管理都正常工作?
显而易见的东西:当然是的我会尽可能地从 VC++ 6.0 中获取所有代码,但我首先需要修补崩溃的生产系统,然后我才能开始这项艰巨的任务推动这个遗留代码库向前发展。
【问题讨论】:
相关但过于模糊的问题,这里的答案必然模糊:***.com/questions/1102279/… m_chReceive 是否总是 NULL 终止? 它总是以空结尾。 【参考方案1】:根据Documentation for VC6.0
CString 对象可以作为连接操作的结果而增长。 CString 对象遵循“值语义”。
【讨论】:
谢谢。所以它应该工作。然而,已知的勘误有很多(如其所说),我还没有找到所有的勘误。【参考方案2】:Microsoft Documentation 似乎表明CString
的用途类似于std::string
,因为它会在需要时自动增长,并且可以作为参数或函数的返回值安全地传递。
【讨论】:
遗憾的是,文档没有说“嘿,如果您使用的是 1998 年的 Visual C++ 6.0,那么这些东西适用于现代东西附带的 MFC 和 Visual C++ 版本”。所以我担心我在问一个大约 1998 年的 Time Machine 问题。在我看来,很多人认为 CString 使用这种方式是安全的,而在现代 C++/MFC 中它似乎是安全的,但是我怀疑(但我不确定)CString 在用作 VC++6/MFC 遗留应用程序中的返回值时存在一些问题。 嗯,该页面可让您返回到文档的旧版本,并且至少可以追溯到 2003 年,它似乎在说同样的事情..以上是关于在 Visual C++ 6.0 MFC 中,CString 是不是可以像简单类型而不是类一样被安全地对待?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Microsoft Visual C++ MFC 2021 进行编程
用啥软件来查看一个用Microsoft Visual C++ 6.0 编写的程序的源代码