Как упоминает vnm, вы создаете временный объект CString
, вызывая его конструктор в строке 3, и затем этот объект немедленно уничтожается.Это освобождает часть памяти, которую он использовал для вашего буфера, что означает, что любые попытки доступа к данным, хранящимся в этой памяти, будут неопределенным поведением.Вот почему ваша строка выглядит искаженной: она уже удалена.
Если вы новичок в C ++, вам нужно убедиться, что вы понимаете время жизни объекта.Это значительно упростит написание этого кода.
Решение состоит в том, чтобы гарантировать, что ваш CString
объект не будет уничтожен, пока вы не покончили с ним.Если вам нужно, чтобы объект существовал только внутри вашей функции, вы можете оставить его как временный объект, созданный внутри этой функции.Если вам нужно, чтобы он существовал вне этой функции, вам нужно создать его на более высоком уровне или сохранить указатель на него.
Обратите внимание, что CString
объекты неявно , преобразуемый в LPCTSTR
.
Таким образом, предполагая, что вам нужен только объект CString
, чтобы остаться в живых в пределах вашей функции, вы можете написать следующий код:
{
// Declare a string literal
LPCTSTR strValue = L"test";
// Encrypt the string
const char* strReturn = MethodCall(strValue);
// Create a CString object representing the encrypted string
CStringA myString(strReturn);
// Do something with myString, like display it in a message box
// (Remember that it's an ANSI (non-Unicode) string!)
// ...
MessageBoxA(NULL, myString, NULL, MB_OK);
// ...
// myString (your CString object) gets destroyed here
}