0

LPTSTRをコピーして、その文字列をメンバー変数としてオブジェクトに格納しようとしています。しかし、LPTSTRをコピーしようとすると失敗したようで、コピーしたLPTSTRの値にアクセス/印刷しようとすると、プログラムがクラッシュします。

LPTSTRをコピーして、以下のクラスに保存することは可能ですか、それともTCHAR *を使用する方がよいですか?

class Checkbox
{
   private:
      LPTSTR text;
      HWND hwnd;

   public:
      Checkbox(HWND nHwnd, LPTSTR nText)
      {
        lstrcpy(checkText, text); 
      }

      void print()
      {
        // Causes a crash
        MessageBox(hwnd, text, text, MB_OK);
      }
};
4

3 に答える 3

1

LPTSTRは単なるポインタです。したがって、使用する前にメモリを割り当てるように注意する必要があります。TCHAR*の場合も同様です。または、Unicode文字列について心配する必要がある場合は、wstringを使用できます。

于 2012-06-11T10:09:38.883 に答える
0

他の回答が言っているように、使用する前に「LPTSTRテキスト」にメモリを割り当てる必要があります。

コピーする文字列の長さを取得し(strlenが実行する必要があります)、次のようにメモリを割り当てます。

text = TCHAR[length];

クラスのデコンストラクターを宣言して、プログラムが終了したとき、またはプログラムがクラスインスタンスのスコープを離れたときに、割り当てられたメモリを削除できます。

~CheckBox()
{
if (text)
delete[] text;
}

また、テキストをNULLに設定するパラメーターのない別のコンストラクターを作成する必要があります。

于 2012-06-11T10:36:25.597 に答える
0

初期化されていないポインタにコピーすると、メモリ内のランダムな領域が上書きされます。最初にポインタにメモリを割り当てる必要があります。また、メモリが不要になったときにメモリを解放することも忘れないでください。

于 2012-06-11T10:07:55.207 に答える