はTCHAR *配列の再新しいはマイナス/未定義の効果を持つのだろうか?あるいは、お勧めしないかもしれませんか?以下のコードはこれまでのところうまく機能しています。入力が必要です。ありがとう!再'new」TCHAR *配列
//e.g.
TCHAR *tc1 = new TCHAR[1];
// later:
//resize TCHARs
tc1 = new TCHAR[size1];
tc1[size1] = { L'\0' };
はTCHAR *配列の再新しいはマイナス/未定義の効果を持つのだろうか?あるいは、お勧めしないかもしれませんか?以下のコードはこれまでのところうまく機能しています。入力が必要です。ありがとう!再'new」TCHAR *配列
//e.g.
TCHAR *tc1 = new TCHAR[1];
// later:
//resize TCHARs
tc1 = new TCHAR[size1];
tc1[size1] = { L'\0' };
これはメモリリークです。 new
によって作成されたものはdelete
にする必要があります。あなたがそれを行う場合は、すべてが正常である:
//e.g.
TCHAR *tc1 = new TCHAR[1];
// later:
//resize TCHARs
delete [] tc1;
tc1 = new TCHAR[size1];
tc1[size1] = { L'\0' };
無関係なノートで、あなたの最後の行は、あなたが割り当てられた配列の後ろに書いているが。それはではなく、です。しかし、それはあなたの記憶の割り当てとは無関係です。それは自分自身のミスです。
文字列クラスを使用すると、これを避けることができます。 std::string
、またはMFCを使用している場合は、CString
です。
最初に 'TCHAR'を使う場合は、' std :: string'の代わりに 'std :: basic_string
「再NEWING」の負の効果は、最初に割り当てられたフリーストアメモリへのポインタを失うということです。それはあなたのプログラムの残りの部分で占領され、それを取り戻す機会はありません。もちろん
、あなたはメモリを指している他のいくつかのポインタを持っているかもしれないが、それは、コードの非常に奇妙で不必要に複雑作品だろう。
はstd::vector
代わりのnew[]
を使用して、すべてのこれらの問題を避けてください。メモリリークに加えて
tc1 = new TCHAR[size1]; tc1[size1] = { L'\0' };
size1
は、最後の有効な指標過去1であるので、これは未定義の動作です。
std::vector<TCHAR> tc1(1);
// later:
//resize TCHARs
tc1.resize(size1);
tc1[size1 - 1] = L'\0';
おそらくstd::string
またはstd::wstring
ニーズには十分である:ここで
はstd::vector
例です。
このようなコードは、アレイを_resize_ない、それは、(メモリリークを引き起こす)アレイに以前のポインタを破棄し、新たな配列へのポインタと 'tc1'を上書き。 –
割り当てられたメモリの割り当てを解除すると、悪影響はありません。 – Asesh
さらに、ワイド文字に '' L''プレフィックスを明示的に使用している場合は、TCHARを使用する理由がなく、代わりにwchar_tを使用するか、_TまたはTEXTマクロを使用します。覚えておいてください、TCHARを使うとあなたのコードは移植不可能になります – Asesh