- ベストアンサー
C++のnewで確保したメモリーの解放の確認方法
C++で作成中のプログラムの一部で、長い文章も処理できるように、構造体とメモリーの動的確保を使用しています。 ただ、動的に確保したメモリーは自分で解放しなくてはならないのですが、プログラムが単純なうちは開放のミスを発見できますが、長くなるとバグで一部開放されない可能性も捨てきれません。 そのようなときに全て開放できたか確認する方法は無いのでしょうか? 開発環境につきましては、 OS WindowsXP HomeEdition コンパイラ BCC 言語 C++ コンソールアプリケーション struct string { char str[512]; struct string* nextstr;}; 簡単には、このような構造体を new で確保し、開放は、先頭から delete してますが、 構造体がこれより結構複雑なため、処理部が長くきちんと開放できているか自信が有りません。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
newやdeleteをdefineで括ってまとめて監視してはどうですか? extern int g_count; #define NEWOBJECT(T) new (T); g_count++ #define DELETEOBJECT(ptr) delete (ptr) ; g_count-- int g_count; //ここのstringは自分で定義した構造体 string *p = NEWOBJECT(string); DELETEOBJECT(p); printf("メモリ確保数=%d",g_count); のようにするとか、 リリース版の時は #define NEWOBJECT(T) new (T) #define DELETEOBJECT(ptr) delete (ptr) とすれば余計の処理も消えますし。
その他の回答 (7)
- KoHal
- ベストアンサー率60% (110/181)
他の方の回答にレスを付けるのは規約違反なのだそうで、これは一人言であります。これも規約違反か(苦笑。 C++においてはクラスも構造体も同じ物です。 structはCとの互換のため、「メンバがデフォルトでpublicなクラス」として定められています。 よって構造体をnewで生成するのもクラスをnewで生成するのも全く同じことです。 まぁ、質問者さんはご存知のことでしょうが、このサイトを閲覧する人の中には混乱してしまう方があるかもしれませんので。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
#6 > new、deleteはクラスのインスタンスの動的生成、破棄のためであって、メモリの領域を動的に確保、解放するためのものではありませんので。 そんなバカな。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
newとdeleteをオーバーライドして確保、解放をファイルなどに記録していく。 というか構造体の領域の確保にnewを使うべきかという時点で違うのではと。 new、deleteはクラスのインスタンスの動的生成、破棄のためであって、メモリの領域を動的に確保、解放するためのものではありませんので。使えはしますが。 malloc、realloc、free等を使うべきだと思いますが。
お礼
回答ありがとうございます。 最初はmallocも考えたのですが、mallocは非常に扱いが難しいため今回の場合はnewを使用しようと思います。
- Tacosan
- ベストアンサー率23% (3656/15482)
可能ならガベージコレクターを使って, そもそも解放など考えなくていいようにするんでしょうけど.
お礼
回答ありがとうございます。 なるほどガベージコレクターですか、 有用な方法ですね。 今後の開発時の手段の一つとして、覚えておきます。
- jacta
- ベストアンサー率26% (845/3158)
> 作成しているのがアプリケーションではなく、ある動作をするためのクラスなので、なるべく他のクラスや関数は使用しないで作ろうと思っているのです。 汎用的なクラスであっても、標準ライブラリを使わない理由は見当たらないと思います。組み込み用途ならそういうこともありますが、違うようですし。 > それに、メモリーの確保や開放を随時行わなくてはかなりのメモリを占有してしまうため、やはり、newとdeleteを使用するしかないのですが、 そういうことであれば、グローバルなnew/deleteではなく、専用のメモリプールを自作した方がよくありませんか?それなら、メモリリークの検出コードや、一括解放などの仕組みを付け加えることもできるはずです。 > 確保するデータ型は文字列(char配列)だけでなくさらに複雑なものもあり、扱うクラスが無いものもあるため、やはり確保と開放を確認しながら自分で作ったほうが安定します。 複雑な処理をnew/deleteでやっていると、メモリリークの対策だけでなく、例外安全性を維持するのも大変ではないですか?せめてstd::auto_ptrを使うぐらいのことはした方がよいと思います。
お礼
回答ありがとうございます。 たしかに、標準ライブラリは使用してもたいした問題は無いですね。 有用な標準ライブラリは使おうと思います。
- t_nojiri
- ベストアンサー率28% (595/2071)
メモリが開放されてるのかどうかなら、spy、パフォーマンスモニタ等のツールもしくは、何かデバッガ関係使うのが良いような気はします。 マルチプログラミング等なら、スレッド単位でデバッグしないとなりませんが。
補足
spyとは何でしょうか? gooで検索したらいろいろ引っかかって絞込みが不可能でした。 パフォーマンスモニタや、デバッガは、使いやすいのがなかなか見つからない故に現在使用していません。 なにか、使いやすいソフトがありましたら教えていただきたく思います。
- jacta
- ベストアンサー率26% (845/3158)
できれば、std::list<std::string>を使うなどして、メモリリークに悩まなくてもよい設計をした方がよいと思います。 もっと楽をしてください。
補足
いろいろなクラス等を使えば楽にはなるのですが、 作成しているのがアプリケーションではなく、ある動作をするためのクラスなので、なるべく他のクラスや関数は使用しないで作ろうと思っているのです。 それに、メモリーの確保や開放を随時行わなくてはかなりのメモリを占有してしまうため、やはり、newとdeleteを使用するしかないのですが、 確保するデータ型は文字列(char配列)だけでなくさらに複雑なものもあり、扱うクラスが無いものもあるため、やはり確保と開放を確認しながら自分で作ったほうが安定します。 それゆえに、確保と開放の時間を確認する方法が知りたいのです。
お礼
回答ありがとうございます。 この方法は実装が簡単そうなので、試してみようかと思います。