HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0731
Y_.repeathspmalloc16解決


Y_.repeat

リンク

2017/7/31(Mon) 17:43:53|NO.80787

こんにちわ
hspmallocが変数解放を最後に行ってるのに憧れて
定義を探してるのですが 自分の検索スキルではみつからなくてですね

hsp3struct.hに


// Plugin info data (3.0 compatible) 331 typedef struct HSPEXINFO30 381 char *(*HspFunc_malloc)( int size );

と書いてあるところまで辿れたんですけど
その処理をどこに書いてるのかわからなくて
記述の箇所を教えていだたけると幸いです



この記事に返信する


tds12

リンク

2017/7/31(Mon) 17:53:29|NO.80788

通常strbuf.cppのsbAlloc関数と思われます。



Y_repeat

リンク

2017/7/31(Mon) 18:09:08|NO.80789

ご回答ありがとうございます
strbuf.cppのsbAllocは
返り値で

91 static char *BlockAlloc( int size )
を呼んでるぽいですね

こういうのはどう検索したらいいのでしょうか
OpenHSPをDLして検索かけるかんじですか?
とはいえtds12さんなら
なんとなく頭に入ってそうですね



tds12

リンク

2017/7/31(Mon) 18:21:49|NO.80790

Visual Studioを使っているなら(2013で確認)
ソースのキーワードの上で右クリックしてメニューから
「すべての参照の検索」をすると、
そのキーワードが使われている一覧が出てきます。
そこで代入されているところを探して、
その代入している関数の「定義へ移動」をしました。



Y_repeat

リンク

2017/8/3(Thu) 19:00:37|NO.80811

VisualStudio2012でやってみました
無事、動作を確認出来ました
ありがとうございました

追記 OpenHSPからのDLの仕方がわからなくて
試行錯誤した後 ググったらzakkiさんのgithubんとこに
ちょっと古いかもしれないですが 一式あったので
メモ的追記でした



Y_repeat

リンク

2017/9/3(Sun) 16:47:41|NO.81220

例えば DLLとかは メモリーリークってどんなかんじなんですか?

少々メモリーリークしてても リークしてるアプリとかが終了した場合
リークしてるメモリ含め 返却されるもんなんですか?
僕の考えはそれっぽくて 少々メモリーリークしてもいいかな?って結論です

メモリーリーク寛容で作ってた場合
メモリーリーク少々してても アプリ終了で返却なら
下手なメモリ管理でメモリ参照時 なくてエラー
と同じようなリスクのような気がするんですよね

DLLの中でmallocした場合
使用してる関数の中でmallocして
関数抜けてもその変数は生きてるっぽいのですが
そのような場合
mallocはHSPmallocでして
onexitした場合にfreeすればOKっぽいっすね
onerrorの処理も書かなきゃダメなのかなあ



Y_repeat

リンク

2017/9/10(Sun) 01:54:03|NO.81303

質問が漠然としすぎだったのでまとめてみます

mallocしてメモリを割り当てると
そのexeが終了した時
割り当てたメモリは解放されるんですか?

dllの中でmallocしたメモリはどうなんすか?

自分的には解放してくれそうに思うんですが
あくまでも推測の域を出ず
詳しい人のおすみつきが欲しい訳であります

Yahoo!知恵袋に行きなさいなら行くので
よろしくお願いします



科学太郎

リンク

2017/9/10(Sun) 03:15:15|NO.81304

> mallocしてメモリを割り当てると
> そのexeが終了した時
> 割り当てたメモリは解放されるんですか?
はい。
開放されます。

> dllの中でmallocしたメモリはどうなんすか?
dllが生きてる限りはメモリ・リークのままでしょうね。



Y_repeat

リンク

2017/9/10(Sun) 04:22:55|NO.81305

回答ありがとうございます
ただ まだもやもやしてて
というのもCはdllの中で使いたいので

>> dllの中でmallocしたメモリはどうなんすか?
>dllが生きてる限りはメモリ・リークのままでしょうね。
ということですが
exeが終了した時 exeの中で呼び出した
dllの中でmallocしたメモリも解放されるんですか?
onexitとonerrorの処理で明示的にdllを解放しなきゃいけないんですか?

どうも質問ばっかでスイマセン



MillkeyStars

リンク

2017/9/10(Sun) 05:37:28|NO.81306

DLL が終了する際、DllMain が呼ばれて、その中の fdwReason に関数の呼び出し理由が設定され、それが DLL_PROCESS_DETACH である場合 DLL 終了のメッセージなので、そこで DLL で確保したメモリーを解放すればいいんじゃないの?



Y_repeat

リンク

2017/9/10(Sun) 09:56:53|NO.81307

重箱の隅をつつくような書き込みで申し訳ない
DLL作成においてmallocの使用が全然イメージ出来ないんですよね
DLLじゃなくても使ったことないんですが

>そこで DLL で確保したメモリーを解放すればいいんじゃないの?
なるほどそういうことでしたらHSPmallocでまとめて解放出来たら楽っすね

>DLL が終了する際
DLLはexeの終了と共に終了すると思っていましたが
明示的に終了させる必要があるんですか?

ちょっとググったら
>プログラムを終了させるには、exit()を使います。
と書いていたんですが
DLLの中でexit()の使用でDLL終了という認識でOKですか?



3k

リンク

2017/9/10(Sun) 12:43:07|NO.81311

うーん、個々の概念に対してもう少し理解を深めないと見えてこないところなので、
「やりたい事」と「やってみてここが問題になってる」というフェーズまで
進めてから話を持ってきた方が(私としては)返信しやすいです…。。。

ざっくり概念のことだけ聞かれても書けることはありますが、
それよりも自分でぐぐった方が検索力も理解力もつきますし。

文字多めになっちゃったけどそこは許して。

---------------------
○メモリについて
プロセスの全ての仮想メモリはOSの管理下にあるため、EXEが確保したものだろうと
DLLが確保したものだろうと関係なくプロセス終了時に全て解放されます。

>DLL作成においてmallocの使用が全然イメージ出来ないんですよね
mallocは使わないのであればそれはそれでリークがなく安全なので、
使う状況になるまでそのままでいいんじゃないんでしょうか。

>僕の考えはそれっぽくて 少々メモリーリークしてもいいかな?って結論です
人それぞれ方針があるのであまり口出すのも失礼だとは思いますが、
メモリリークはただのバグなので、痛い目見る前に潰すべきだと基本的には思っています。
リークしている量とリークするまでの時間が分かっていて、かつ常駐アプリでない、
リークした箇所にメモリアクセスしない、等まずリークによって問題が起こり得ないと
確定しているなら道の一つだとは思いますが。

>DLLの中でmallocした場合
>使用してる関数の中でmallocして
>関数抜けてもその変数は生きてるっぽいのですが
というか、mallocってそういう用途のものです。
ヒープとスタックで調べてください。

---------------------
○DLLについて
Dynamic Link Libraryの略ですが、大事なのは最後の”Library”で、
乱暴ですがHSPで言うと”モジュール”に相当するような単語です。

つまり基本的には元のプログラム(この文脈ではEXE側)に対して、
例えば暗号化など特定の機能を提供するプログラムを意味します。

どういった機能がどういったように使うかはEXE側の処理ですが、
そもそも「こういった機能を持ったDLLがあるので使いたい」というのもEXE側の責任なので、
EXE側はDLLを自分のプログラム内にアタッチを行います。
(=EXE内でDLLのエクスポートした関数を使えるようにする)

DLLは機能を提供するだけと言っても、機能を提供するために前準備や後準備が
あるかもしれないので、DLLがEXEにアタッチされた時やデタッチされた時などに
特定の関数が呼ばれる仕組みになっています。

DLLは必ずデタッチされますが、DLL側からそれを行う訳ではありません。
デタッチは基本的にはEXE側から明示的にされますが、行われなかったら
EXEが終了する時にOSが勝手にやってくれます。
HSPを触っている以上はDLLのデタッチは内部に隠蔽されているので、気にする必要はありません。

そして、DLLはアタッチされてEXEと同じプロセス空間に配置されるので、
「DLLだから○○しなければ」という道理はどこにもありません、実行コード上EXE本体と同じ扱いです。

---------------------
とりあえず困ってないで、変な機能使おうと思わずDLL作ってみた方が、
トライ&エラーも出来るようになるし、早いんじゃないんですかね。

個人的には、どうもmallocの使い道も分かってないようなので、hspmalloc使う前に
素のmalloc/freeだけで小さい何かを作ってみてメモリ管理の必要性を感じてみた方がいいように思います。

あと、このスレッドもうそろそろ表題と中身があってきてないかも。



Y_repeat

リンク

2017/9/10(Sun) 15:56:12|NO.81315

>3kさん
返信ありがとうございます
ベストアンサーってかんじです
あんまり頻繁に書き込みすぎても うざいかもしれないので
返信は間を空けてしますね

以前作成したwikiのまとめサイトみたいのに
ここのスレッドの内容をコピペしようと思っているので
コピペして欲しくない人がいましたらご一報ください
いつのまにかスパムに荒らされて移転中でございますが^^;



3k

リンク

2017/9/11(Mon) 12:40:22|NO.81319

>Y_repeatさん
すみません、私の書き込み(このスレだとNO.81311と、これ自体もですかね)については
コピペしないで頂ますようお願いします。



Y_repeat

リンク

2017/9/12(Tue) 19:56:04|NO.81330

>3kさん
承りました

一応、許可を聞いておいてよかったです

まとめサイトはpukiwikiになり凍結しまくりです

URLはコチラ

http://zuzazann.main.jp/wiki151/index.php?index

dllはbccで簡単なののサンプル作成出来ました

やっつけですが メモにしました よろしけれどうぞ

http://zuzazann.main.jp/wiki151/index.php?bccでdll作成



Y_repeat

リンク

2017/9/13(Wed) 23:34:06|NO.81336

こんばんわ
幾らかひっかかったキーワードがあるので
それに関して少々書いてみます

・「やりたい事」
このスレ書きながら見えてきたんですけど
githubで めっけた某簡易言語(Cで書かれてる)
をdll化してHSPから呼び出すようにして
今年のコンテストに投稿です

今年はイマイチ ゲームの案がないんですよね

・「やってみてここが問題になってる」
で、それを改造してみたいんですけど
mallocとかcallocとか結構使ってて
そこが全然理解出来ないんです
ポインタもあんまりわかんないんですけど
たぶんほとんど配列的使用だな。と予想してます

前はこれをCからHSPに翻訳しようかな。と思ってたんですが
ポインタもmallocも結構使ってて
簡易言語 深く理解して
車輪の再発明的製作が必要そうで
まだ無理そうです
ポインタはCにあってHSPにない
機能の大きな1つみたいですから

・メモリ
https://wiki.hsp.moe/MakeHPI/cpp/chapter2.html
>データを保持するための領域に静的変数を使うか、動的確保にするかの制限はありませ ん。
>C/C++ならmalloc()で動的割り当ても可能です。
>ただしこの場合メモリ管理はプログラマが全責任を負って行う必要があります。
http://prograpark.ninja-web.net/index.html
Home -> HSP講座 -> HPI編 No.05
>hspmalloc, hspexpand, hspfree は、関数 malloc, realloc, free とほぼ同じです。
>実装は sbAlloc, sbExpand, sbFree 関数です。
>strmul() 関数は、実装の都合上 hspfree( psResult ) としませんが、
>hspmalloc した領域はHSPの終了時に解放されるので、
>メモリリークの心配はありません (いわゆる内部リークはします)。
両方一部抜粋っす
関心のある方はURL辿ってくださいな
やっぱりdllでmallocしたのはfreeしないとメモリ・リークになるという意見が多いですね

「DLLについて」のくだりは参考になります

DLLは講座サイトを参考にして サンプルをDLLに出来ました
CはINPUT/OUTPUT処理を改造するなりなんなり
そっちの方向からも攻めていきたいです

全体像のイメージは
命令で動いて
止まる時に
プログラムカウンタとかもろもろの情報を返します
いっぺんにじゃなく 何回か命令呼び出して
再開はプログラムカウンタを渡すとそこからまた動きます

dllをライブラリとして使うのではなく
dllが全体の処理で 入出力とかで止まった時にHSPが動いて
命令呼び出して動くの再開みたいな

やりたいことをネットに書くと やんなくなるという噂がありまして
何のCプログラムか?とか 全体のイメージとか(大分ぼやかして書いてはおきましたが)
書いちゃってて 大丈夫かな?ってかんじです



Y_repeat

リンク

2017/9/17(Sun) 16:41:22|NO.81352

こんにちは。現在はコンテスト期間内に形になるかな?とか思いながら
全然わかんないとか言わないように、ちょこちょこmallocの講座を読んだり写経したりしてます

Cとかdll内でmallocして解放しなかったら
メモリーリークになるのかな?ってのが疑問だったんですけど
自分なりに一応理解いたしました

上手くググればみつかりそうな気な気もしますが
自分まだまだググるの下手なんで どうやればググってひっかかるのか
わからなくて質問しました

ではでは



ONION software Copyright 1997-2023(c) All rights reserved.