2012-04-27 10 views
2

標準ライブラリ文字列のプレースメントnewのメモリリークに直面しています。標準ライブラリ文字列のプレースメント新しいメモリリーク

以下は、リークが表示されているコードを示しています。

string string1("new string"); 
char _string[sizeof(string)]; 
new(_string) string(string1); 

リークがdbxを使用して発見され、それが

Actual leaks report (actual leaks:   1 total size:   52 bytes) 

    Total  Num of Leaked  Allocation call stack 
    Size  Blocks Block 
        Address 
========== ====== =========== ======================================= 
     52  1 0x43f68 operator new < std::basic_string<char,std::char_traits<char>,std::allocator<char> >::__getRep < std::basic_string<char,std::char_traits<char>,std::allocator<char> >::basic_string < main 


Possible leaks report (possible leaks:   0 total size:   0 bytes) 

これは実メモリリークですか漏れとしてこれをintrepreting dbxのある以下のように示されていますか?

+0

'_string'の' std :: string'デストラクタをどこかで呼び出していますか? – Sven

+0

*達成しようとしていること* *つまり、なぜ新しいプレースメントを使用しますか?この壊れたソリューションを使用して解決しようとしている最初の問題は何ですか(実際のメモリ管理を持たない環境でコードを実行しない限り、プレースメントnewは解消されます)。 – Griwes

+0

'_string'配列が' std :: string'に対して適切に整列されているとは限りません。 – GManNickG

答えて

6

さらに、placement newで作成した文字列オブジェクトのデストラクタを呼び出す必要があります。

std::stringは、カスタムアロケータを指定していない限り、ヒープに格納されている文字の記憶域を割り当てます。 (sizeof(string)は定数であり、文字列に格納されているものに依存しません)

+0

Nitpick:配置 'new'で作成された*すべての*オブジェクトのデストラクタを*明示的に呼び出す必要があります。例: 'name。〜string();' –

+0

こんにちはお返事ありがとうございます。私は前に_string->〜string()としてデストラクタを呼び出そうとしましたが、コンパイルエラーを出してしまいました。この場合、STL :: destructorsを呼び出すべきかどうか混乱していました。今私はちょうど文字列に型キャストしようとし、デストラクタを呼び出しました。今は漏れはない。 (文字列*)_文字列) - >〜文字列() – sandy

+0

@ user1357856:これは正しいことですが、さらにもっと正しいことは、新しい配置を使用しないことです。何も購入しません(デストラクタを呼び出すために少し狂った構文を除いて)。文字列 "contents"はまだヒープ上に 'new'で割り当てられていますので、私が知る限り有用なことはしません。 – Mat

関連する問題