簡體   English   中英

為什么MFC C ++ CString(const char *)完全更改const char *值?

[英]Why does MFC C++ CString(const char*) completely changing const char* value?

我希望標題足夠好,可以幫助解釋我遇到的問題。 我認為一旦解決了這個問題,我的項目就會完成。 請注意,兩個項目都是在Unicode下編譯的。

我正在使用帶有LPCTSTR並返回const char*CLI/C++ DLL。 如果在逐步執行時將返回值存儲在項目中的const char*中,則可以看到返回值就是我希望返回的值。

現在,如果我執行以下操作:

LPCTSTR strValue = L"test";
const char* Return = MethodCall(strValue);
LPCTSTR Final = CString(Return);

返回值將等於“ Xmkk = Asmks”(這應該是)。 此方法加密字符串。 問題是當我執行CString ,Final將等於“ ﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮ㹙癩鞮᠀諸²⤐²”。 如何在不更改其數據的情況下將onst char*轉換為LPCTSTR

謝謝。

銷毀CString(Return)之后(此情況發生在“其構造后的下一行”)。“最終”指針指向已釋放的內存塊(該內存是內部CString(Return)緩沖區)。 在這一點上,它指向的內存內容是不確定的,取消引用它的行為是不確定的。
為了安全地使用指向內部緩沖區的指針,您應該確保擁有緩沖區的CString只要指針處於活動狀態。


LPCTSTR strValue = L"test";
const char* Return = MethodCall(strValue);
LPCTSTR PointerToBuffer= 0;
{
  CString ReturnStringObj(Return);
  PointerToBuffer = ReturnStringObj;  
  // Can safelly use your pointer here  
}
// Here ReturnStringObj is killed and pointer dereferencing is invalid here



正如vnm所提到的,您通過在第3行中調用其構造函數來創建一個臨時CString對象,然后該對象立即被銷毀。 這會重新分配用於緩沖區的內存塊,這意味着任何嘗試訪問該內存中存儲的數據的操作都是未定義的行為。 這就是您的字符串看上去亂碼的原因:它已被刪除。

如果您不熟悉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
}

您可以做的是創建一個新的CStringA對象,並將其CStringAconst char*作為Final。 然后,只要定義了CStringA,Final將保持有效。

我建議不要使用CString (或CStringW )來存儲需要使用const char*訪問的存儲。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM