К сожалению, у меня есть (а) оригинальная документация по продукту без каких-либо ошибок (файлы справки MS VC ++ 6.0) или (б) более поздняя справка MSDN, которая применима к более поздним версиям MFC.
Особенно:
[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
}
У меня есть код, который использует две вышеупомянутые вещи повсеместно и который также, кажется, демонстрирует случайное повреждение памяти во время выполнения. Для меня эти две вещи — красные флаги, я прав, подозревая, что авторы MFC в Visual C ++ 6.0 предполагали, что CString будет хорошей простой вещью, которую можно использовать, как int
или char
типа, и вернуть его из функции и каким-то образом копировать конструкторы и управление памятью все просто работало?
Очевидные вещи: Да, конечно Я получу весь свой код от VC ++ 6.0, когда смогу, но сначала мне нужно будет исправить производственную систему, которая рушится, а затем я могу начать огромную задачу по продвижению этой унаследованной кодовой базы вперед.
В соответствии с Документация для VC6.0
Объекты CString могут расти в результате операций конкатенации.
Объекты CString следуют «семантике значений».
Документация Microsoft кажется, указывает на то, что CString
по назначению похож на std::string
в том смысле, что он растет автоматически, когда это необходимо, и его можно безопасно передавать как аргументы или возвращаемые значения функций.