は、次のC++のプログラムを考えてみましょうメモリーリークの可能性使用してC++文字列
==1643== HEAP SUMMARY:
==1643== in use at exit: 26 bytes in 1 blocks
==1643== total heap usage: 1 allocs, 0 frees, 26 bytes allocated
==1643==
==1643== LEAK SUMMARY:
==1643== definitely lost: 0 bytes in 0 blocks
==1643== indirectly lost: 0 bytes in 0 blocks
==1643== possibly lost: 26 bytes in 1 blocks
==1643== still reachable: 0 bytes in 0 blocks
==1643== suppressed: 0 bytes in 0 blocks
あなたが見ることができるように、ありますヒープ上に割り当てられた26バイトが失われました。私はstd::string
クラスが12バイトの構造体(少なくとも私の32ビットx86アーチとGNUコンパイラ4.2.4では)と "Hello、World!"を持っていることを知っています。ヌルターミネータは14バイトです。私が正しく理解していれば、12バイト構造体には文字列へのポインタ、割り当てられたサイズ、および参照カウントが含まれています。
私の質問:C++の文字列はスタック/ヒープに関してどのように格納されていますか?宣言されたときにstd::string
(または他のSTLコンテナ)のスタックオブジェクトが存在しますか?
P.S.私はどこかvalgrind かもしれないは、STLコンテナ(および "ほとんどコンテナ"、例えばstd::string
)を使用するいくつかのC++プログラムで、メモリリークの偽陽性を報告する可能性があります。私はこのリークについてあまり心配していませんが、STLコンテナとメモリ管理に関して私の好奇心を誇示しています。
なぜあなたはdie()を呼び出していますか? – EboMike
@EboMike: 'exit(0)'呼び出しを 'main()'から分離する 'die()'関数を書いています。私のプログラムは現在、このプログラムの実行時に 'exit(0)'関数が「プラグをプルする」関数に制御を移す必要があります。このプログラムは、学問的理由以外の有用な目的を果たしていないことに留意してください。 – pr1268
私のポイントは、最初の場所でdie()がリークを引き起こすということです。あなたがそこにdie()を持っていることを嫌っているなら、少なくとも文字列をそれ自身のスコープに入れてください。 – EboMike