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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0613
Y_repeatDLL内静的データ確保8解決


Y_repeat

リンク

2020/6/13(Sat) 21:30:07|NO.90761

こんばんわ
自分はHSPと他言語の連携でプログラミングすることを夢見てます

例えばCとかC++を対象とすると
mallocするといつ廃棄すればいいかよくわかりません

なので例えばプレイヤーとか敵のデータを構造体で管理して
静的にメモリを確保するのはどうなのかな?と思いました
もう動的確保は諦めてデータは全部静的グローバルなのにしちゃえば
DLLを読み込んだ時にデータを確保し
HSPが死ぬ時に一緒に死んでくれるのでは?と思ったんですが
どうなんでしょう

例えばそうなってる事の確認の仕方とかも
教えていただけると嬉しいです



この記事に返信する


あらや

リンク

2020/6/14(Sun) 05:28:30|NO.90768

あいまいで申し訳ないのですが
DLLの静的ロードはプログラム終了と同時に解放されるけれど
動的ロードの場合はfree関数を使わないと
メモリリークが発生するような事をどこかで見たような。。。

どちらにしても終了時処理の関数も用意しておいて
終了時にfreeでメモリを解放するようにソースを組んだ方が無難かと思います。

メモリリークの確認は
https://www.wingfield.gr.jp/archives/1680
https://teratail.com/questions/20458
などなどのリンクを参考までに。



MillkeyStars

リンク

2020/6/14(Sun) 09:11:38|NO.90770

動的メモリは、対象のプロセスが終了すると継承していない限り破棄されます。
なので巨大なメモリを確保しない限り明示的に free を行わなくても構いません。

メモリリークが問題になるのは、常時アプリケーションのメモリ管理です。



Y_repeat

リンク

2020/6/14(Sun) 11:26:11|NO.90772

こんにちは
解答ありがとうございます→あらや様。MillkeyStars

動的確保に関しては意見が割れてますね

静的確保は一致してるぽくて安心しました



Y_repeat

リンク

2020/6/14(Sun) 11:26:38|NO.90773

こんにちは
解答ありがとうございます→あらや様。MillkeyStars様

動的確保に関しては意見が割れてますね

静的確保は一致してるぽくて安心しました



Y_repeat

リンク

2020/7/11(Sat) 12:15:13|NO.90963

ちょっと調べてみました


onexit *my_end onerror *my_error //×ボタンを押すと:*my_endにjump // 強制終了かけるとdialog出ない // error起こさせる:*my_errorにjump #if 0 dim a,-1 #endif // 無限ループでフリーズ // 強制終了かけるとdialog出ない #if 0 while 1 wend #endif stop *my_end dialog "my end",1 end *my_error dialog "my error",1 end
dialogが出ない時は
dllの動的メモリ削除用命令を呼び出してくれないかんじがするのですが
どうなんでしょうか

強制終了かけた時になんらかの動作をしてから終了してもらえる方法とかあるのでしょうか

ちなみに強制終了をかけた時、knowbugのwindowは消えませんでした



Y_repeat

リンク

2020/7/11(Sat) 12:26:03|NO.90964

最近、積んでいた
14歳からはじめるC++ゲームプログラミング
という書籍を読んでいるのですが

静的メモリは100MBくらいが最大で
もっと大きいメモリを確保したい時は
動的に確保してください。みたいです

ですがSTLのクラスを使用すると
メモリの確保と削除をSTLのクラスでやってくれるみたいです

そうすると
HSPで強制終了かかったら
DLLでSTL使用してると
メモリは解放してくれるのでしょうか

動的メモリをたくさん使用するなら
DLLじゃなくcppのexeと連携する方が
exeを終了させやすいのではないかと思います

自分の場合、静的メモリが100MBもあれば十分足りる気もしますが



MillkeyStars

リンク

2020/7/11(Sat) 16:11:12|NO.90965

そもそも強制終了かけた場合、プログラム自身ではなくOSの管轄となります。
プログラムから確保されたメモリアドレス空間をOSが一括で解放を行う為、プログラムでの解放する意味がないのです。

詳しくは、Wiki の https://ja.wikipedia.org/wiki/仮想記憶#仮想アドレス空間管理 を参照してください。

【注意】プログラムA でプログラムB のメモリを確保するなどの場合は、メモリリークを引き起こします。この場合での強制終了はOSは関与いたしませんのでご注意を。



Y_repeat

リンク

2020/7/13(Mon) 23:01:17|NO.90980

教えていただいてまことにありがとうございました→MillkeyStars様



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