2011-01-27 23 views
2

私はこのコードを書いた:メモリリークの原因になりますか?

string getWinTitle(HWND hwnd){ 
const int MAX_LENGTH = 1000; 
wchar_t title[MAX_LENGTH]; 
ZeroMemory(title, MAX_LENGTH); 
GetWindowText(hwnd, (LPWSTR)title, MAX_LENGTH); 
char* buffer = new char[MAX_LENGTH]; 
wcstombs(buffer, title, MAX_LENGTH); 
string res = buffer; 
return res; 
} 

は、ここではメモリリークがありますか? ZeroMemoryによって割り当てられたメモリを解放する必要がありますか? バッファに割り当てられたメモリを明示的に解放する必要がありますか?

は、それがnew []割り当てられていますので、あなたがdelete [] buffer;に必要なあなたに

答えて

9

ありがとうございます。

ZeroMemoryは、メモリブロックを0で埋めますが、メモリ割り当ては行いません。

また、wchar_tアレイを扱っているため、std::wstringを使用していないのはなぜですか?

編集あなたはスタックに割り当てられた配列を使用することができ、実行時の値に依存割り当てサイズを使用していないので、メモリの割り当て

を回避

string getWinTitle(HWND hwnd){ 
    const int MAX_LENGTH = 1000; 
    wchar_t title[MAX_LENGTH]; 
    ZeroMemory(title, MAX_LENGTH); 
    GetWindowText(hwnd, (LPWSTR)title, MAX_LENGTH); 
    char* buffer = new char[MAX_LENGTH]; 
    wcstombs(buffer, title, MAX_LENGTH); 
    string res = buffer; 

    delete [] buffer; // You must do this, otherwise this is a memory leak if buffer is never deleted 

    return res; // res's data is copied from buffer, it is not affected by you doing delete [] buffer 
} 

実証するために、

string getWinTitle(HWND hwnd){ const int MAX_LENGTH = 1000; wchar_t title[MAX_LENGTH]; ZeroMemory(title, MAX_LENGTH); GetWindowText(hwnd, (LPWSTR)title, MAX_LENGTH); //char* buffer = new char[MAX_LENGTH]; char buffer[MAX_LENGTH]; // this is on the stack wcstombs(buffer, title, MAX_LENGTH); string res = buffer; return res; } // buffer is automatically cleaned up 
+0

+1 @マイケルズ:十分に手助けをしたら、この回答を受け入れてください。 –

+2

+1。代わりに、単にスタック内に 'buffer'を定義して、メモリ管理を全く扱わなくてもかまいません。 –

+0

Davidさん、スタックにバッファを定義する方法は? – michaels123

関連する問題