2011-08-09 9 views
1

C++のヒープに関する小さな理解の問題があります。ヒープを理解する問題

私はWchar_t配列をChar-Arrayに変換するための小さなクラスを作成しました。ここに私の変換クラスの一部である:

私は動的にヒープの新シャア・アレイを作成した.h CPP-ファイルに

class ConvertDataType 
{ 
private: 
    char *newChar; 
}; 

た.cpp

size_t i; 
char *newChar = new char[wcslen(WcharArray)]; 
wcstombs_s(&i, newChar, strlen(newChar), WcharArray, wcslen(WcharArray)); 
return newChar; 

。 変数を正しく削除するにはどうすればよいですか?私はそれが好きだろう

delete[] newChar[i]; 

:私は... forループで

delete[] newChar; 

を異なる、例をたくさん読ん

~ConvertDataType(void) //deconstructor 
{ 
delete[] newChar; 
} 

は正しいことですか? newChar[i]のコンテンツはどうなりますか?私はちょうどポインタを破壊するのではないですか?

私はクラスを使用すると、メモリリークが発生したという問題はまだありますか? これはどのようにすることができますか?デコンストラクタdelete[] newChar;に追加しました。

+1

を 'のstd :: STRING'と'のstd :: wstring'を使用することです。後者を前者に変換するには、 'std :: string s(w​​s.begin()、ws.end())'を実行します。 –

+1

今は私が言ったように、それはとてもうまく動作します。ありがとうございました。このソリューションを使用すると、メモリリークの問題を修正することもできます。みんな、ありがとう! – hofmeister

答えて

0

解決策は正しいです。 delete []に電話すると、ポインタで参照されるメモリブロックは空きとして設定されますが、それ以上は何も設定されません。このアドレスブロックに別のメモリを割り当て、データを上書きするまで、コンテンツはそこに残ります。しかし、あなたは削除されたメモリから読むことに頼ることはできません。ときどき動作しますが、それは「事故」です。

1

delete[] newCharを呼び出すのが正しい方法です。

理論上はデストラクターは、削除された配列内のすべてのオブジェクト/文字に対して呼び出されます。しかし、charはプリミティブ型なので何もしません。とにかく配列を削除した後、newChar[i]にアクセスしないでください。

+0

これは、ポインタやメモリ内のすべてのものだけを削除しますか?これはデコンストラクタで実行できますか? NULLをチェックする必要がありますか? – hofmeister

+0

@ Taz:いいえ、あなたはNULLをチェックする必要はありません。そしてあなたが書いたようにデストラクタで呼び出すことができます。 –

2

operator new[]()で割り当てられたものは、operator delete[]()で割り当て解除する必要があります。


しかし、ここで私は別の問題を参照してください。

wcstombs_s(&i, newChar, strlen(newChar), WcharArray, wcslen(WcharArray)); 

3番目のパラメータは、実際にあなたが望むものではありません。バッファのサイズを渡したいが、最初の位置から最初のヌル文字までnewCharの文字数を渡したい(詳細はstrelen()のマニュアルを参照)。ここでは、new char[wcslen(WcharArray) + 1]によって割り当てられるべき割り当てられたメモリチャンクの実際の長さであるため、wcslen(WcharArray) + 1(余分なヌル文字用に1)が3番目のパラメータとして必要です。

0

使用

size_t new_size = wcslen(WcharArray); 
size_t number_of_converted = 0; 
this->newChar = new char[new_size]; 
wcstombs_s(&number_of_converted, this->newChar, new_size, WcharArray, new_size); 

は、ローカル変数を作る後者の場合に

char *newChar = new char[wcslen(WcharArray)]; 

のinsted。 Windows上で私は、変換するためにWideCharToMultiByteを使用します。まだ良い

DWORD mb_size = WideCharToMultiByte(
    CP_UTF8, // UTF-8 encoding 
    0,   // flags 
    WcharArray, // wide char input 
    -1,   // find the end of string 
    NULL,  // no input, we want to know the necessary space 
    NULL,  // no input size 
    NULL,  // no default chars 
    NULL);  // no used default chars 
this->newChar = new char[mb_size]; 
mb_size = WideCharToMultiByte(
    CP_UTF8, // UTF-8 encoding 
    0,   // flags 
    WcharArray, // wide char input 
    -1,   // find the end of string 
    this->newChar, // target string 
    mb_size,  // target string size 
    NULL,  // no default chars 
    NULL);  // no used default chars 
関連する問題