2017-12-23 22 views
1

はTCHAR *配列の再新しいはマイナス/未定義の効果を持つのだろうか?あるいは、お勧めしないかもしれませんか?以下のコードはこれまでのところうまく機能しています。入力が必要です。ありがとう!再'new」TCHAR *配列

//e.g. 
TCHAR *tc1 = new TCHAR[1]; 

// later: 

//resize TCHARs 
tc1 = new TCHAR[size1]; 
tc1[size1] = { L'\0' }; 
+3

このようなコードは、アレイを_resize_ない、それは、(メモリリークを引き起こす)アレイに以前のポインタを破棄し、新たな配列へのポインタと 'tc1'を上書き。 –

+0

割り当てられたメモリの割り当てを解除すると、悪影響はありません。 – Asesh

+2

さらに、ワイド文字に '' L''プレフィックスを明示的に使用している場合は、TCHARを使用する理由がなく、代わりにwchar_tを使用するか、_TまたはTEXTマクロを使用します。覚えておいてください、TCHARを使うとあなたのコードは移植不可能になります – Asesh

答えて

2

これはメモリリークです。 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です。

+0

最初に 'TCHAR'を使う場合は、' std :: string'の代わりに 'std :: basic_string 'を使いたいでしょう。 – user2079303

2

「再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例です。