DXライブラリ関数の DxLib_End 関数つきまして

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ムンバ

DXライブラリ関数の DxLib_End 関数つきまして

#1

投稿記事 by ムンバ » 15年前

こんばんはっ!
夜分、申し訳け無いのですが、帰宅が遅くなってしまったもので。(_ _)

DXライブラリの DxLib_End 関数につきまして

 ・DXライブラリが使用していたメモリ領域を開放し、ウィンドウを閉じる。
  (↑とある本の、ご解説引用)

 ・DXライブラリの使用を終了する関数です。
  DXライブラリを使用しているソフトはすべてソフトを
  終了させる前にこの関数を呼ぶ必要があります。
  同時に、DXライブラリはソフトのウインドウの制御も しているので
  この関数を呼び出した後はなるべくすぐにプログラムを 終了させなければなりません。
  (↑DXライブラリ置き場のリファレンスマニュアルの、ご解説引用)

とあるのですが、例えば・・・

DXライブラリのメイン関数内で(DxLib_Init 関数 ~ DxLib_End 関数の間で)

malloc 関数でメモリを動的確保し、free 関数でメモリの解放をしなかった場合
もしくは
new 演算子でメモリを動的確保し、delete 演算子でメモリの解放をしなかった場合

つまり、両者(それぞれ)共に
動的確保したメモリを解放しなかった(し忘れてた時などの)場合なのですが

1:動的確保したメモリは、DxLib_End 関数により、全て解放される。

2:動的確保したメモリは、DxLib_End 関数により、全て解放されないが
  プログラムを終了すれば、動的確保したメモリは全て解放される。

3:動的確保したメモリは、DxLib_End 関数によって全て解放されないが
  プログラムを終了しても、動的確保したメモリは全て残るが
  パソコンを再起動(終了)すれば、全て解放される。

3-1:プログラムを終了しても、動的確保したメモリは全て残って
  パソコンを再起動(終了)しても、全て解放されない。(残る)

4:動的確保したメモリが全て残っていたとして
 「窓の手」というソフトの中の「掃除機」を使うと
  動的確保したメモリは、全て解放される。<窓の手、ご存知の方のみ

5:動的確保したメモリが全て残っていたとして
 「窓の手」というソフトの中の「掃除機」を使っても
  動的確保したメモリは、全て解放されない。<窓の手、ご存知の方のみ

6:DXライブラリを使用したプログラム内では
  動的確保したメモリは、自分で解放しないと何をしても全て解放されない。


上記、いずれのどれでしょうか?
詳しい方がいらっしゃいましたら、ご指導の程、宜しくお願い致します。

---編集・追伸---

7:本家で聞けっ!
 
 宜しくお願いします。
 今日は寝ます。すみません。
 おやすみなさい。
画像

y

Re:DXライブラリ関数の DxLib_End 関数つきまして

#2

投稿記事 by y » 15年前

先に申し上げておきますと、DXライブラリが使用していたメモリというのは
DXライブラリ内部で確保されたメモリのことで、
DXライブラリを使用したプログラム内で自分でmallocしたり、newしたメモリとは全く無関係です。

例えば、DxLib::LoadGraph関数内で動的にメモリを確保した場合は、そのメモリに関しては解放されますが、
main関数で自分で確保したメモリに関してはきちんと自分で解放すべきです。
(かならずfreeまたはdeleteすべきかどうかの論争は、筋違いなので割愛)

解放し忘れたメモリがどうなるかは、環境依存となります。
プログラムが終了した時点で全て解放される環境もあれば、
OSをシャットダウンして電源を切るまで解放されない環境もあります。

また、選択肢の内容から察するに、
メモリに関して勉強されていないようなので申し上げておきますと、
メモリの内容はメモリの特性上、電源を切った時点で全て消えます。

以上を踏まえると、提示して頂いた選択肢の中に的確な答えはございません。
しかし、Cとmallocとメモリリークについて勉強すれば、すぐに答えが出るかと思います。

ムンバ

Re:DXライブラリ関数の DxLib_End 関数つきまして

#3

投稿記事 by ムンバ » 15年前

yさん、早速のご指導ありがとうございます。(_ _)

6:DXライブラリを使用したプログラム内では
  動的確保したメモリは、自分で解放しないと何をしても全て解放されない。

という事で、宜しいでしょうか?

>>DXライブラリを使用したプログラム内で自分でmallocしたり、newしたメモリとは全く無関係です。

 DxLib_End 関数を使っても解放されない。で、良いのでしょうか?

 つまり、DXライブラリで使用するメモリとは別に
 mallocしたり、newしたりした時のメモリは、別に用意されるので
 DxLib_End 関数を使っても解放されず、それぞれは個別に解放しなければならない。

と、解釈して宜しいのでしょうか?
 
 
  画像

ムンバ

Re:DXライブラリ関数の DxLib_End 関数つきまして

#4

投稿記事 by ムンバ » 15年前

>しかし、Cとmallocとメモリリークについて勉強すれば、すぐに答えが出るかと思います。

 初心者なりに勉強した上での、悩んだ上で質問させて頂いてるのですが・・・。
 本題は、タイトルの通り、DxLib_End 関数についてです。
 生意気な事言って、申し訳ないです。(謝
 環境依存ではなく、読んだ本に・・・
 の、せいにするのも良くないですね。<反省^^

>>メモリの内容はメモリの特性上、電源を切った時点で全て消えます。

=====↓編集・追加部位(自分の書き込み内容の変更は、あえてしません。)=====

 ↓ここからの文章は、yさんに対してでは無く、自分の解釈についての書き込みです。

 「嘘つきは、泥棒の始まり」という言葉を、ご存知でしょうか?
 記録は、ほぼハードディスクに残ります。
 記憶は、ほぼメモリに残ります。
 電源を切った時点で、メモリの記憶は全て消滅するかもしれませんが
 再度、電源を入れた場合、記録に残った記憶は、メモリ上で復活します。

 ↑ここからの文章は、yさんに対してでは無く、自分の解釈についての書き込みです。

=====↑編集・追加部位=====


すみません。明るくなってしまったので、寝ますね。
おやすみなさい。(∪。∪)。。。zzzZZ
   画像

Mist

Re:DXライブラリ関数の DxLib_End 関数つきまして

#5

投稿記事 by Mist » 15年前

> 「嘘つきは、泥棒の始まり」という言葉を、ご存知でしょうか?
> 記録は、ほぼハードディスクに残ります。
> 記憶は、ほぼメモリに残ります。
> 電源を切った時点で、メモリの記憶は全て消滅するかもしれませんが
> 再度、電源を入れた場合、記録に残った記憶は、メモリ上で復活します。

自分の無知を棚に上げて他人をうそつき、泥棒呼ばわりはいかがなものかと。
休止やスリープのような特殊な終了を行った場合を除けば、メモリの内容は電源OFFで消えて復活なんてしませんよ。

MNS

Re:DXライブラリ関数の DxLib_End 関数つきまして

#6

投稿記事 by MNS » 15年前

前提として、いわゆるRAMと呼ばれるパソコンの記憶装置として使われているメモリは、
電気の供給がなくなると内容が全て消えてしまう、という性質を持っています。
ゆえに、パソコンの電源をOFF、再起動などの作業を行うと、メモリの全内容は消えます。
これは誤りでも何でも無いでしょう。

つまり、再起動を行ってもメモリが解放されないという場合はありません。
次に、アプリケーションを終了した場合ですが、この時のメモリリークは、
OSが勝手に解放してくれることが多いです。これが環境依存ということですね。
もちろん解放してくれない環境も存在します。ですから一概に
「プログラムを終了すれば、動的確保したメモリは全て解放される。」
ということは出来ません。そういう意味で適切な選択肢とyさんは言われたのではないかと思います。

いずれにせよ、自ら確保したメモリを、DXライブラリが解放してくれることはありません。

バグ

Re:DXライブラリ関数の DxLib_End 関数つきまして

#7

投稿記事 by バグ » 15年前

とりあえず、『自分が確保した領域は、自分で後始末をする!』と覚えておけばよいかと思います。

softya

Re:DXライブラリ関数の DxLib_End 関数つきまして

#8

投稿記事 by softya » 15年前

> 「嘘つきは、泥棒の始まり」という言葉を、ご存知でしょうか?
> 記録は、ほぼハードディスクに残ります。
> 記憶は、ほぼメモリに残ります。
> 電源を切った時点で、メモリの記憶は全て消滅するかもしれませんが
> 再度、電源を入れた場合、記録に残った記憶は、メモリ上で復活します。

ありえません。
何処で誤解されたのか知りませんが、メモリ(SRAM、DRAM)を含めた揮発性メモリは電気が通じている間だけ情報を保持します。
※現代の主力メモリであるDRAM系は実際のところ数百msしか保持出来ないので一定周期でリフレッシュと言う書き直しまで行っています。
電源を切っても記憶を保持出来るのは、不摘発メモリと呼ばれていて一番有名なのはフラッシュメモリです。
商品としては、SSD、SDカード、USBメモリなどの商品ですね。
パソコンで休止した場合にメモリが復活するのはメモリの内容を全てハードディスクに書き出しているためです。スリープで復活するのはそもそもメモリの電源を遮断していないため。

DxLib_End()に関しては、DxLib関係で確保したメモリを記録していて、それを解放しているだけです。DxLibに関係ないところでメモリをmallocやNewされてもDxLibにとっては知ったことではありません。WindowsやLinuxなどのしっかりとしたOSが動いているプラットフォームを前提で書けばメモリはOSがプロセス単位で管理していますので、OSがmallocやNewの状況を把握しています。プロセスが終了するときにはOSが残ったメモリを全て解放しますので、残ることはありません。

ムンバ

Re:DXライブラリ関数の DxLib_End 関数つきまして

#9

投稿記事 by ムンバ » 15年前

おはようございます。

<<Mistさん
 ご解説ありがとうございます。---←誤字・編集---
 >>「嘘つきは、泥棒の始まり」という言葉を、ご存知でしょうか?
すみません。うまくお伝えできなくて。
 自分の事を言おうとしたのですが、読み返してみると
 yさんに対して、言ってる様に読めますね。(汗

 <<yさん、ごめんなさい。私への言葉ですので
  お気を悪くされたら、大変申し訳御座いませんでした。

>>休止やスリープのような特殊な終了を行った場合を除けば
  メモリの内容は電源OFFで消えて復活なんてしませんよ。

 特殊な終了を行った場合以外は、電源を切るとメモリの内容は全て消えるのですね。
 了解しました。
 文章の方も、ご指摘頂きましてありがとうございました。
 以後、気をつけます。すみませんでした。
 また何かありましたら、宜しくお願い致します。

<<MNSさん
 ご解説、ご指摘どうもありがとうございます。

 >>再起動を行ってもメモリが解放されないという場合はありません。
 >>次に、アプリケーションを終了した場合ですが、この時のメモリリークは、
 >>OSが勝手に解放してくれることが多いです。これが環境依存ということですね。
 >>もちろん解放してくれない環境も存在します。ですから一概に
 >>「プログラムを終了すれば、動的確保したメモリは全て解放される。」
 >>ということは出来ません。そういう意味で適切な選択肢とyさんは言われたのではないかと思います。

 了解しました。
 DxLib_End 関数では、動的確保したメモリは解放されず
 プログラムを終了した場合に
 環境依存により、解放してくれる場合もあれば、してくれない場合もある。
 yさんのご解説、「電源を切れば全て解放される」も含めまして
 理解できました。
 どうもありがとうございました。

<<バグさん
 ご指導ありがとうございます。

 >>『自分が確保した領域は、自分で後始末をする!』
 電源を切れば、メモリの内容は全て消えるが
 お行儀?上(これも、言い方悪いかもです。)、自分できちんと後始末する。
 という事ですね。
 ありがとう御座います。理解できました。

<<yさんへ(ご解説頂いた皆様にも)
 せっかく、ご丁寧にご解説して頂いたにも関わらず
 私の至らぬ所で、大変、不愉快な思いをさせてしまいました事
 心からお詫び申し上げます。
 本当に申し訳御座いませんでした。
 以降、気を付けますので、誠に勝手ながらお許しいただけます様
 何とぞ宜しくお願い致します。(謝
 
 >>以上を踏まえると、提示して頂いた選択肢の中に的確な答えはございません。
 >>しかし、Cとmallocとメモリリークについて勉強すれば、すぐに答えが出るかと思います。

 その前に、日本語の勉強が必要ですね。
 どうもありがとうございました。

皆さん、ご迷惑をおかけしました。
メモリの解放、自分なりに理解できました。
また何かありましたら、ご指導・ご指摘の程、宜しくお願い致します。
どうもありがとうございました!
失礼します。 画像

ムンバ

Re:DXライブラリ関数の DxLib_End 関数つきまして

#10

投稿記事 by ムンバ » 15年前

すみません。softyaさんとかぶってしまいました。

>>softyaさん
 ご解説、どうもありがとうございます。
 > 「嘘つきは、泥棒の始まり」という言葉を、ご存知でしょうか?
 > 記録は、ほぼハードディスクに残ります。
 > 記憶は、ほぼメモリに残ります。
 > 電源を切った時点で、メモリの記憶は全て消滅するかもしれませんが
 > 再度、電源を入れた場合、記録に残った記憶は、メモリ上で復活します。

 言い訳がましくて申し訳ないのですが、この文章は自分の事です。
 No:53695 の私のレスを読んで頂ければわかると思います。
 今、改めて何度も読み返しながら、深く反省している所です。

 今後の私自身のためにも、あえて編集はしませんので
 お気に触りましたら、どうかご勘弁下さい。
 申し訳御座いませんでした。

---↓編集追加---

改めまして、softyaさん
ご指摘・ご解説どうもありがとうございます。

 >>電源を切っても記憶を保持出来るのは、不摘発メモリと呼ばれていて
 >>一番有名なのはフラッシュメモリです。
 >>商品としては、SSD、SDカード、USBメモリなどの商品ですね。
 >>パソコンで休止した場合にメモリが復活するのはメモリの内容を
 >>全てハードディスクに書き出しているためです。
 >>スリープで復活するのはそもそもメモリの電源を遮断していないため。

了解しました。ありがとうございます。
今、まさに「穴があったら入りたい。」状態です。
いつも余計な事を書いてしまい、ご迷惑お掛けします。
また何かありましたら、ご指導・ご指摘の程、宜しくお願い致します。
失礼します。

---↑編集追加--- 画像

バグ

Re:DXライブラリ関数の DxLib_End 関数つきまして

#11

投稿記事 by バグ » 15年前

>>電源を切れば、メモリの内容は全て消えるが
>>お行儀?上(これも、言い方悪いかもです。)、自分できちんと後始末する。
>>という事ですね。
>>ありがとう御座います。理解できました。


PCの電源は切らないけれど、ソフト自体は何度も再起動させるようなシステムだったら…
メモリを動的確保しているのに、解放していない関数を繰り返し呼び出すような仕様だったら…

というように、メモリリークしているとマズイ状態(逆に良い状況はあるのかな?(^_^;))というのは結構あります。

ですので、かならず確保と解放は1セットと覚えた方がよいですよ。予期せぬ不具合を引き起こしてデバッグで地獄を味わう事になりますので(笑)

ムンバ

Re:DXライブラリ関数の DxLib_End 関数つきまして

#12

投稿記事 by ムンバ » 15年前

こんにちは。

バグさん、再度ご指導ありがとうございます!

>>予期せぬ不具合を引き起こしてデバッグで地獄を味わう事になりますので(笑)
 気を付けます。^^;

また何かありましたら、宜しくお願い致します。
失礼します!

ムンバ

Re:DXライブラリ関数の DxLib_End 関数つきまして

#13

投稿記事 by ムンバ » 15年前

こんばんは。

解決ボタンを押した後に大変申し訳御座いません。
ご解説・ご指導頂いた「yさん」は、特にご気分を害された事と思います。
私の書き込みを読まれた方々にも、不愉快な思いをさせてしまいました。
本当に、申し訳御座いませんでした。(謝

<< 「嘘つきは、泥棒の始まり」という言葉を、ご存知でしょうか?
<< 記録は、ほぼハードディスクに残ります。
<< 記憶は、ほぼメモリに残ります。
<< 電源を切った時点で、メモリの記憶は全て消滅するかもしれませんが
<< 再度、電源を入れた場合、記録に残った記憶は、メモリ上で復活します。

言い訳がましくなる事、どうぞ、ご承知おき下さい。
自分なりに、お伝えしようかどうか悩みました。
今更、起こってしまった事を元に戻す事などできないのは承知の上なのですが
ご指摘があった、この私の文章なのですが・・・

私は掲示板に(他のサイトでも)書き込みする際 <特に、文章が長くなりそうな場合
メモ帳に、少しずつコピーを取りながら書き込みをしています。
何故かと言うと

・自分、キーを押し間違えて、時間をかけて書いた文章が全て消えてしまう事が多々ある。
・一時的にコピーした文章を読み返して極力、誤字脱字が無い様にしたいと思っている。
 (それでも、間違いありますが。)
・タグの間違いなどを、確認する。

=====ここからが、私の言い訳です。=====

メモ帳からコピーした文章を、こちらの掲示板に貼り付ける際に
コピーする箇所を間違えて(足りなくて)、眠かった事もあり
確認不足のまま、文章(挨拶)を添えて寝てしまいました。

コピーした、メモ帳の文章には

<< 再度、電源を入れた場合、記録に残った記憶は、メモリ上で復活します。

の後に、「自分はこう思っていました。(その他)」
の様なカキコ(貼り付け)をしたつもりでいましたので
昼に起きて、こちらの掲示板を拝見させて頂いた所
自分で読み返して見ましたが、後の祭りだったのです。
本当に、ひどい文章でした。

yさん、ご指導・ご解説して下さった方々、管理人さん、このスレッドを読んで頂いた方々
私の至らぬ所で、申し訳御座いません。
図々しいお願いかと思うのですが、今後とも何か御座いましたら
もし宜しければ、ご指導・ご解説の程、何とぞ宜しくお願い致します。
ご迷惑をお掛けしました。
本当に、すみませんでした。(謝

y

Re:DXライブラリ関数の DxLib_End 関数つきまして

#14

投稿記事 by y » 15年前

いえいえ、ご理解いただければ幸いです。
私も偉そうなことを言ってしまってすみません。

C言語の中でも、メモリ管理の分野は特に難しい問題です。
ですので動的確保したメモリがどうなるか、というのは気になるところだと思います。
ただ、質問の内容を見る限りまだ勉強不足であると勝手ながら判断させて頂いたので、
ああいう書き方になってしまいました。

質問する上で大事なのは、自分はどこまで知っていて、どこまで頑張ったかを明示することです。
質問の質はどうであれ、回答する側はそういう情報を加味すると回答しやすい場合があったり、
一件素人丸出しの質問でも(失礼)、知識の度合いによっては質問の意味が変わることもしばしばあります。

確保したメモリはどうなるの?といった、疑問や好奇心は大事にしてください。
なぜこうなるの?とか、どういう実装なの?という疑問は、私としても教え甲斐がありますし、
私自身が知りたいときもあります。
なので今回の件に懲りず、これからも是非質問をしてください。
私も、全力で回答したいと思います。

ムンバ

Re:DXライブラリ関数の DxLib_End 関数つきまして

#15

投稿記事 by ムンバ » 15年前

yさん、こんばんは。
本当に、申し訳け御座いませんでした。(謝
(以降、yさんのレス文多用、お許し下さい。)

>>私も偉そうなことを言ってしまってすみません。

 その様には感じていません。
 今後とも、感じたままにご解説頂ければと思います。
 今までも、こちらの掲示板で色々な方々からの、ご指導やご解説で
 鍛えられていると思ってますので、その辺は大丈夫です。(自爆
 今回の、私の文章こそが偉そうな事を言っている。
 と、思って頂ければ幸いです。
 お心使い、感謝します。ありがとうございます。

これもまた、言い訳がましくなりますが

動的確保されたメモリは、バグさんがおっしゃられている
(他の方々の、ご指導・ご解説頂いたDXライブラリの関数などのレスも踏まえた上です。)

>>『自分が確保した領域は、自分で後始末をする!』

今回の私の疑問、スレッド No:53667 で質問させて頂きました内容は
今勉強してる本に

・DXライブラリが使用していたメモリ領域を開放し、ウィンドウを閉じる。

と、ありましたので
DXライブラリのソース内(main関数内)で使用された全ての関数、つまり
malloc 関数・new 演算子(←関数で無いのも疑問なのですが)を使用して
それぞれ解放する関数・演算子
(本によると、全ての関数となってますので、演算子は如何なるものか?と思いながら)
を、使用しなかった場合でも
DxLib_End 関数で、解放されるのかどうかお聞きしたかった次第です。
この時点で、質問の意図を、うまくお伝えできていませんでした。
申し訳御座いません。

>>確保したメモリはどうなるの?といった、疑問や好奇心は大事にしてください。
 はい。ありがとうございます!

>>ただ、質問の内容を見る限りまだ勉強不足であると勝手ながら判断させて頂いたので、
 おっしゃる通りです。
 趣味でプログラミングを始めたのですが、こちらのサイトや他サイト、本を読んだりして
 独学で勉強している中、不安に思った事は、いつもこちらの掲示板で質問させて頂いてます。
 こちらで、ご指導・ご解説頂けると、納得できると言うか安心できるんですよね。
 そこで今回も甘えてしまい、またまた余計な事を言ってしまい、大失態をしてしまいました。

>> なので今回の件に懲りず、これからも是非質問をしてください。
>> 私も、全力で回答したいと思います。
 ありがとうございます!
 私は、全力でぶつからせて頂くとすると、また失態をしそうなので
 もう少し、気軽に <変な意味は、決して御座いません。
 質問させて頂きたいと思います。

yさん、お心使い・ご指導・ご解説、ありがとう御座いました。
再度お付き合い頂きまして、どうもありがとう御座います。
今後、また何か御座いましたら、勝手ながら宜しくお願い致します。

PS:今日は熟睡できそうです。ありがとうございます。
  お騒がせしました。
  おやすみなさい。

softya

Re:DXライブラリ関数の DxLib_End 関数つきまして

#16

投稿記事 by softya » 15年前

まぁ、出だしのところはミスだろうなとは思っていましたが、
 > 記録は、ほぼハードディスクに残ります。
 > 記憶は、ほぼメモリに残ります。
 > 電源を切った時点で、メモリの記憶は全て消滅するかもしれませんが
 > 再度、電源を入れた場合、記録に残った記憶は、メモリ上で復活します。
これを半分でも信じていたら怖いので書かせてもらいました。
みなさんにも誤解は伝わったと思いますので、気になさらないでください。

で、
>DXライブラリのソース内(main 関数内)で使用された全ての関数、つまり
>malloc 関数・new 演算子(←関数で無いのも疑問なのですが)を使用して
>それぞれ解放する関数・演算子
>(本によると、全ての関数となってますので、演算子は如何なるものか?と思いながら)
>を、使用しなかった場合でも
>DxLib_End 関数で、解放されるのかどうかお聞きしたかった次第です。
は、まだ誤解がある様です。
DxLibが把握しているのはDxLib内部で呼び出したメモリアロケート(mallocやnew)などのメモリで、これはリスト構造など(詳しく調べておりませんので違う方法の可能性が高いです)で後で解放のために記録されています。DxLib外であるユーザープログラムが何をしているかは監視出来ませんので、ライブラリ利用者であるムンバさんがどんなメモリアロケートを行ったかはDxLibは情報を得ることが出来ません。つまり、ムンバさんが確保したメモリを解放する権利も情報もありません。
ちなみにnew演算子に関しては、C++の文法書をお読みください。

ムンバ

Re:DXライブラリ関数の DxLib_End 関数つきまして

#17

投稿記事 by ムンバ » 15年前

おはようございます。

softyaさん、再度どうもありがとうございます。
お心使い、ありがとうございます。
了解しました。
もう少し、踏み込んで勉強してみます。

>>ユーザープログラムが何をしているかは監視出来ませんので、ライブラリ利用者であるムンバさんがどんなメ>>モリアロケートを行ったかはDxLibは情報を得ることが出来ません。つまり、ムンバさんが確保したメモリを>>解放する権利も情報もありません。

後始末も、自分が責任を持ってやる。(汗

本当にありがとうございました。
また何かあれば、その節は宜しくお願い致します。
失礼します!

閉鎖

“C言語何でも質問掲示板” へ戻る