1748129 メンバー
3761 オンライン
108758 解決策
新規ポスト

メモリ確保、解放について

 
W_Ha
時折のアドバイザー

メモリ確保、解放について

C言語で開発しているのですが、malloc()でメモリ確保を行って、処理終了後、free()にてメモリ解放を行うコードが1関数内で完結するようにコーディングしたものがあります、その関数はプログラムが起動中に何度も呼び出されます。またプログラムは何ヶ月も連続で動作するものです。

メモリの解放はfree()にて間違えなく行っているのですが、実際にはメモリをどんどん消費して行くと指摘を受け(実際に症状が発生しているらしいです)、VMSではmalloc()->free()の方法ではメモリを使えないと言われました。にわかに信じがたいのですが、本当なのでしょうか?システム的な設定などの問題があるのでしょうか?

どなたかお分かりになる方いらっしゃましたら、おしえてください。よろしくお願いします。

コンパイラのバージョン(cc/versionを実行しての表示):

Compaq C V6.4-008 on OpenVMS Alpha V7.2-1

3件の返信3
Ju_Mo
時折のアドバイザー

メモリ確保、解放について

可能性としては

1.その関数にバグがあった。

2.その関数以外の部分でプログラムにmalloc()やstrdup()などが使用されていた。

それから

3.V7.2-1だとVMS721_ACRTL-V0400というパッチがある(が関係なさそう)。

4.lib$get_vm()、lib$free_vm()に書き変えてみると緩和された。

デバッガヒープアナライザでなんとかならんだろうか。

W_Ha
時折のアドバイザー

メモリ確保、解放について

Vernonさん返信ありがとうございます。

各項目の回答としては。

1.関数にバグは無いと確信しています。

2.malloc,freeは他には存在しませんし、strdupも使用していませんでした。

3.パッチについて、よくわかりませんでした(が関係なさそうと言うことですので気にしないことにしました)

4.代替案は考えていません。ですがありがとうございます。

このプログラムは安全を考慮してか、メモリ確保は基本的にデータの最大値を想定して配列で固定サイズを確保するようになっています。

そこで無駄が多いので私がmallocで必要なときに必要なサイズのメモリ確保を行おうとしたところ、メモリ使用量が増加して…と槍玉に上げられていまして、

代替案としては他の方法にならって、固定サイズの確保を行うことで回避できるのですが、私の興味もあり、VMSではmalloc,freeが使用できないものかどうか、など情報やご意見をお持ちの方がいらっしゃらないかと思い質問させていただきました。

VMSに関してあまり経験がありませんので、わからないことが多いです。「LIB$〜」とか「デバッガヒープアナライザ」とか、何か調べようとしてもなかなかドキュメントから探し出せなくいつも四苦八苦しています。

引き続き何らかの情報が頂けましたらよろしくお願いします。
Ju_Mo
時折のアドバイザー

メモリ確保、解放について

malloc使ってるけど、プログラムのバグでfreeされなかったというぐらいしか知らないので、その関数を適当なサイズで百万回(?)使用するサンプルを作ってバグレポートしてみてはどうでしょうか。

資料はgoogleで検索するしかないのでは。

LIB$〜はシステムコールみたいなので、「RTL Library (LIB$) Manual」にあります。英語しかないのでここ。

http://h71000.www7.hp.com/doc/os82_index.html

「デバッガ説明書」はV7.2-2のところにあるようです。

http://h50146.www5.hp.com/products/software/oe/openvms/manual/