1

不幸的是,我拥有的文档要么是 (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 中删除我的所有代码,但我首先需要修补一个崩溃的生产系统,然后我可以开始推进这个遗留代码库的艰巨任务。

4

2 回答 2

1

根据VC6.0 的文档

CString 对象可以作为连接操作的结果而增长。CString 对象遵循“值语义”。</p>

于 2012-12-15T17:37:11.663 回答
0

Microsoft Documentation seems to indicate that CString in purpose is similar to std::string in that it grows automatically when needed, and can be safely be passed around as arguements or return values of functions.

于 2012-12-15T17:23:51.507 回答