[ttssh2-dev 409] 開放するべきメモリ

Back to archive index
NAGATA Shinya maya.****@gmail*****
2022年 5月 23日 (月) 23:03:22 JST


永田です。

> すべてdestroy(),free()したい、
> でも大変だったらそのままでもいいか、Windowsに任せよう、
> という感じでいました。

> プログラム動作中に1回確保してプログラム終了までずっと使って
> 終了時にfree()しないというのは、
> そういうのもあってもいいじゃないかというのが私の考えでです。
> 開放しない=メモリリーク=絶対あかん、とは思わないです。

そうですね。たとえば、TEK ウィンドウは「開く/閉じる」を複数回
行えるので、こういうものは free していきたいです。
r9948, r9949 で修正入れましたが、削除処理を入れた箇所がおかしければ
(アプリによって OnClose と OnDestroy)指摘/修正してください。
後述の、アプリを終了した時のダンプを見るときに、「これは無視できる」
というのが分かるようになっていれば助かります。


> これに関連して、
> TTSetIcon()で、アイコン名にNULLを渡した時の動作ですが、
> (r9933で直していただいたtypoのところです)
> もしかすると、NULL を WM_SETICONして、
> 戻ってきたハンドルをDestroyIcon() するほうが
> 良いような気もします。考え中です。

SETICON したときに押し出された既存のアイコンのハンドルと、
GETICON で得られる今のアイコンのハンドルに違いがあるのでしょうか?


> libressl内でfree()していないメモリがあるようだな、とか。

SSH 接続したあとだと 1500 くらいダンプが出ますよね。
ttxssh 内で確保されたものもあるようです。
「ウィンドウを閉じずに再度接続する」を繰り返していくと、
どうなるか気になりますね。


> ダンプ見みて、free()していないのは意図通りなのかわからないので
> なるべくすべて free() するのが良いと思います。
> 今後はダンプが出ない状態を目指してすすめましょうか
> (free()しないないならソースにかいておく、ですね)
> 
> 現在、ダンプされるなかで、確保元ファイル名が
> win32helper.cpp、asprintf.cpp で、
> メモリの内容がパスっぽいものは、想定内というか、
> free()をどうするか考えるのを後回しにしていたものです。
> 
> iniファイルを読み込むttpset.dllでファイル名などを
> 動的なメモリ(=ヒープ)に確保しています。
> このヒープはttpset.dllのものなのでの、
> 他のモジュール(dll,exe)で操作(free()など)を行うのは良くないとされています。

意図して free しないところは、コメントがあると分かりやすくて助かり
そうです。


> r9442の「ウィンドウの設定ダイアログにフレームを表示しない設定を追加」の動作を
> Windows XPで様子を見ようとしたのですが、
> TERATERM.INIを保存しようとすると、
> ttpset.dllで確保したメモリ(パス)をttermpro.exeでfree()しようとして
> 例外で落ちるようでした。
> ttpset.dllのヒープをttermpro.exeで操作しようとしたことになります。
> 私が開発に使っているWindows 10ではokで、
> 試したXPでだめな理由はよくわかっていないのですが、
> ttpset.dllはttermpro.exeにマージするのが安全ではないかと思っています。
> 
> 特に困ることがなければマージを考えようと思います。
> 何か問題ありそうでしょうか?

マージすることの影響がどう出るのかは私には分かりませんが、
「サポートを切る予定の OS である XP で落ちる」ことへの対応としての
マージよりも、重要度の高い作業があると思います。


-- 
TeraTerm Project https://ttssh2.osdn.jp/
NAGATA Shinya <maya.****@gmail*****>



ttssh2-dev メーリングリストの案内
Back to archive index