メモリリーク? – 固定ページ 3 – プログラミング – Home

通知
すべてクリア

メモリリーク?

固定ページ 3 / 3

K
 K
(@K)
ゲスト
結合: 23年前
投稿: 98
 

PSP_DEVICE_INTERFACE_DATA InterfaceDataStructure = new
SP_DEVICE_INTERFACE_DATA;
PSP_DEVICE_INTERFACE_DETAIL_DATA DetailedInterfaceDataStructure = new
SP_DEVICE_INTERFACE_DETAIL_DATA;

ここ↑で new しているのを delete しないまま関数を抜けているようですが、
構わないのでしょうか?

後者の DetailedInterfaceDataStructure は、
delete しないまま malloc() して上書きし、
さらに free() せずに関数を抜けているようですが、
構わないのでしょうか?

C++/CLI の new って、自動的に解放してくれるんでしょうか?
それはそれで(普通のC++の感覚だと)恐ろしいような気もしますが・・・


返信引用
なべ使い
 なべ使い
(@なべ使い)
ゲスト
結合: 9年前
投稿: 25
Topic starter  

ITOさん、Kさんありがとうございます。

このソース含む他でもCreateFileに対してのclosehandleはしていないです。
この場合、closehandleするのは、どこが適当なのでしょうか。return;の前位でしょうか。
また、Connect_checkは、1回だけで良いとありますが、接続時にこれと同じ内容のconnect関数
を1回行い、定期的な接続確認の為にConnect_check関数を使用しています。
このConnect_checkをコメントアウトすると接続しているデバイスの電源を切っても接続の切断
情報をPOPアップ表示することが出来なくなってしまいます・・・。
本来は、接続しているデバイスの電源が切れたときは、どの様に認識して表示するのでしょう
か。


返信引用
みい
 みい
(@みい)
ゲスト
結合: 23年前
投稿: 65
 

> C++/CLI の new って、自動的に解放してくれるんでしょうか?
gcnewは自動解放だけど、newは普通のC++と同じに明示的に解放
しないといけなかったはず。

> 本来は、接続しているデバイスの電源が切れたときは、どの様に認識して表示するので
しょう
> か。
私は読み書きに失敗した時に1回Closeした後再度接続処理して…とかやってます。


返信引用
なべ使い
 なべ使い
(@なべ使い)
ゲスト
結合: 9年前
投稿: 25
Topic starter  

みいさんありがとうございます。

まず、CloseHandleについては、 if(MatchFound == true)を抜けたInterfaceIndex++;
の所で行いました。
InterfaceDataStructureの解放に関しては、WriteHandle7 = CreateFile((.....の下で
deleteしましたが、DetailedInterfaceDataStructureの解放はどのようにすれば良いの
でしょうか。
Kさんが言うようにdeleteせずにmaloocで上書きしていますが・・・
この場合は、最後のmalloc後でfreeすれば良いのでしょうか。もしくは、mallocで使わ
れる前に一度deleteして、malloc後にfreeとなるのでしょうか。

また、読み書きに失敗した時に1回closeして再度接続処理をするというのは、通信失敗
した時に強制的にCloseするということなのでしょうか。
この通信失敗は、USBの接続断認識とは別物と考えて良いのでしょうか。


返信引用
K
 K
(@K)
ゲスト
結合: 23年前
投稿: 98
 

問題を整理した方がよさそうな気がしますが、
本題(?)の「メモリリーク」に関してのみ。

new / malloc() で確保したメモリを解放していないこのソースでは
メモリリークが発生するでしょう。
# thx > みいさん
なおここでのメモリリークはUSBもPICも関係ありません。
「確保したのを解放してない」単なる「C/C++の問題」です。

> InterfaceDataStructureの解放に関しては、WriteHandle7 = CreateFile((.....の下で
> deleteしましたが、

それだけではまだ不足しているでしょう。
たとえば MessageBox::Show( 接続が切れました。, ...);
で return するケースでは、「delete しないまま」になってしまいます。
「すべての return 箇所」で delete する必要があります。

> DetailedInterfaceDataStructureの解放はどのようにすれば良いのでしょうか。
> Kさんが言うようにdeleteせずにmaloocで上書きしていますが・・・
> この場合は、最後のmalloc後でfreeすれば良いのでしょうか。もしくは、mallocで使わ
> れる前に一度deleteして、malloc後にfreeとなるのでしょうか。

new したものは delete して、malloc() したもの free() しなければなりません。

1)new する
2)delete する ←この処理が無いのでメモリリークしている
3)malloc() する
4)不要になったら free() する ←この処理が無いのでメモリリークしている
の順番になるでしょうが・・・
このあたりの処理がすごく気持ち悪いので、私が手を入れるならざっくり
書き直します。


返信引用
なべ使い
 なべ使い
(@なべ使い)
ゲスト
結合: 9年前
投稿: 25
Topic starter  

Kさんありがとうございます。

return箇所も全て、そうですよね。

Kさんみたくざっくり書き直すことは出来ないので、都度newに対してのdelete、
maloocに対してのfreeを追加してみます。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 23年前
投稿: 1235
 

うーーん、
気になったのはKさんの
>後者の DetailedInterfaceDataStructure は、
>delete しないまま malloc() して上書きし、
こういうのまだないですか?

ひょっとしたらすべて、new-deleteで済ませられるのではないでしょうか。


返信引用
なべ使い
 なべ使い
(@なべ使い)
ゲスト
結合: 9年前
投稿: 25
Topic starter  

ITOさんありがとうございます。

間を空けてしまいすみません。
return箇所も含めて行っておりますが、return箇所にdelete()を入れるとエラーが発生
するなどあり、ちょっと時間が掛っております。
エラーとしては、以下のようなものです。
・System.Runtime.InteropServices.SEHException'のハンドルされていない例外が
xxxxxx.exeで発生しました。
追加情報:外部コンポーネントが例外をスローしました。
・_Block_Type_Is_Valid (pHead->nBlockUse)
・_CrtIsValidHeapPointer(pUserData)

あと、この部分を解消すればメモリリークもなくなるので無いかと思っています。
思いたいです・・・

また、すみませんがご教示の程お願い致します。


返信引用
みい
 みい
(@みい)
ゲスト
結合: 23年前
投稿: 65
 

deleteした後にまたその変数をdeleteしているとかはないですか?

下記で二重delete防いではいかがでしょうか。
・deleteしたら変数にNULLをセットする
・delete前にNULLかどうかチェックして、NULLだったらdeleteする


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 23年前
投稿: 1235
 

deleteとnewの重複をチェックしたほうがいいですね。

void Connect_check( void )を抜けてところでdeleteしている可能性もありますね。


返信引用
なべ使い
 なべ使い
(@なべ使い)
ゲスト
結合: 9年前
投稿: 25
Topic starter  

みいさん、ITOさんありがとうございます。
二重deleteでエラーが出ていました。やはり、deleteしたらNULLにて、NULLチェックもするよう
にします。
関数抜けてのdeleteはないみたいです。

長々とご教示頂いてありがとうございます。
本当に助かります。

また、宜しくお願い致します。


返信引用
みい
 みい
(@みい)
ゲスト
結合: 23年前
投稿: 65
 

多分ハンドルCloseの件解決していない気がします…

CreateとCloseのとこにBreakPointはって
1対1で対応しているか確認してみて下さい。


返信引用
固定ページ 3 / 3

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました