メモリの確保と解放

解決


bluf  2005-10-13 19:43:01  No: 18045

EditとButtonA、ButtonBがあって、ButtonAを押下するとEdit内の任意の数字分メモリを確保すると言うものを作りました
Pointer := AllocMem(StrToInt(edtMany.Text));
ここまではうまくいきました

しかし、もう一つの違うButtonBを押下すると、Edit内の任意の数字分メモリを解放するという処理が書けません
教えてください><

また、上記のメモリ確保なんですが、大きなサイズを確保しようとすると、やたら遅いです。。。
何か対処法はないでしょうか・・・?

宜しくお願いしますm(_ _)m


は?  2005-10-13 20:14:37  No: 18046

> しかし、もう一つの違うButtonBを押下すると、Edit内の任意の数字分メモリを解放するという処理が書けません

「書けない」の意味が不明

1)エディタが破損(クラッシュ)して書けない
2)記述方法がわからない
3)コンパイルエラーになる
4)実行時にエラーになる

> また、上記のメモリ確保なんですが、大きなサイズを確保しようとすると、やたら遅いです。。。

どこかに解説があったような気もするが、みつからんし自分で説明できるほどでもないので割愛。
でも、なぜそのような大きなメモリを確保しないといけないのか?
それを回避する手段はないのか考えたほうがいいと思われる。


tu-ka  2005-10-13 20:42:24  No: 18047

指定した分減らしたサイズで新しく領域を確保。そっちにメモリ内容を移動させて、元の領域は完全に解放。これでは駄目ですか?


Joker  2005-10-13 21:57:19  No: 18048

To:は?さん
>「書けない」の意味が不明
記述方法がわからない、という意味です
ヘルプを見たり、検索してもわかりませんでした
言葉足らずで申し訳ないです

>でも、なぜそのような大きなメモリを確保しないといけないのか?
>それを回避する手段はないのか考えたほうがいいと思われる。
メモリをギリギリまで使用して、メモリ不足のエラーが起こる時の某アプリケーションの挙動を調べたいので、
その状況を作るために、です
なので、回避する手段とかは・・・^^;

To:tu-kaさん
>指定した分減らしたサイズで新しく領域を確保。そっちにメモリ内容を移動させて、元の領域は完全に解放。これでは駄目ですか?
やってみました!
出来ました!!
ありがとうございます〜
でも、予想通りというか、やっぱり遅いっすねぇ。。。


えーと  2005-10-13 22:32:29  No: 18049

ReallocMem とかそういう意味ではない?


Joker  2005-10-13 23:12:30  No: 18050

>ReallocMem とかそういう意味ではない?
これってメモリの再割り当てですよね?
え〜と、すいません
これをどう使うんでしょうか^^;


えーと  2005-10-13 23:48:26  No: 18051

> Edit内の任意の数字分メモリを解放するという処理が書けません

再割り当てそのものだと思うけど


えーと  2005-10-13 23:53:12  No: 18052

ReallocMem() の ヘルプより

P が nil ではなく Size が 0 以外の場合,ReallocMem は P で参照されるブロックを,Size で指定されるサイズに割り当て直す。ブロック内の既存のデータは再割り当ての影響を受けないが,ブロックのサイズが大きくなった場合には,新しく割り当てられた部分の内容は未定義となる。適切な位置に割り当て直すことができなかったブロックはヒープ内の新しい位置に移され,それに従って P が更新される

既存サイズを小さくして RallocMem() じゃ何でダメなの? 既存データコピーする
必要ないし


Joker  2005-10-14 01:02:03  No: 18053

>えーとさん
すいません><
てんぱってたので、勘違いしてました^^;
ちゃんとReallocMemで出来ました!
ありがとうございます


Joker  2005-10-14 01:07:23  No: 18054

それで・・・

メモリ確保時に、やたら時間がかかるのの解決方法、対処方法などがわかる方
どうかお願い致します

また、1つ追加なのですが、メモリをある程度確保するとそれ以上確保が出来なくなります
タスクマネージャ上で確認すると、仮想メモリサイズが2,000,000強になるとそうなるようです
同じアプリをもう一つ起動すると、そちらでは問題なく確保の続き?が出来るのですが・・・
なぜでしょうか?
また、これの対処方法などもあれば教えてくださいm(_ _)m


@123  2005-10-14 01:34:22  No: 18055

メモリーマネージャを変えてみる。


@123  2005-10-14 02:03:22  No: 18056

http://sourceforge.net/projects/fastmm/
FastMM
//使用例
program Project1;

uses
  FastMM4,//ここに宣言で使える。
  Forms,
  Unit1 in 'Unit1.pas' {Form1};


Joker  2005-10-14 03:23:25  No: 18057

To:@123さん
もう少し詳しくお願いできませんか^^;
すいません><

って、今気付きましたが、名前を途中で変えちゃってますねorz
誠に申し訳ないm(_ _)m


えーと  2005-10-14 03:37:06  No: 18058

>uses
>  FastMM4,//ここに宣言で使える。

アプリで使った場合は、メモリマネージャ本体も exe の中にコンパイルされるんでしょうか?

つまり、exe 単体で配布出来るかってことですけど。


@123  2005-10-14 05:53:27  No: 18059

メンチマーク
http://dennishomepage.gugs-cats.dk/MemManBenchmark047.xls
http://dennishomepage.gugs-cats.dk


Joker  2005-10-15 00:18:41  No: 18060

すいません
メモリマネージャの変更、僕には難しすぎるようです・・・

他の方法、もしくは、残りの質問の回答募集

ほんと、すいませんです


masayan  2005-10-15 01:00:29  No: 18061

>また、上記のメモリ確保なんですが、大きなサイズを確保しようとすると、やたら遅いです。。。
>何か対処法はないでしょうか・・・?

Windowsは、物理メモリーが不足するとディスクをメモリーの代わりに使います。ディスクは、
メモリーよりも何十倍も遅いので処理が遅くなって当然です。

>また、1つ追加なのですが、メモリをある程度確保するとそれ以上確保が出来なくなります
>タスクマネージャ上で確認すると、仮想メモリサイズが2,000,000強になるとそうなるようです
>同じアプリをもう一つ起動すると、そちらでは問題なく確保の続き?が出来るのですが・・・
>なぜでしょうか?

Windowsでは、使用できるメモリーサイズに上限があります。Windows2000/XP の場合、標準で
は、1つアプリケーション毎に2GB(約2,000,000バイト)までです。システム全
体では、物理メモリーと仮想メモリー(ディスク)を足した容量が上限です。

このため、仮想メモリーが十分あれば、1つのアプリケーションで幾らメモリーを消費しよう
とも(システム全体のパフォーマンスは低下しますが)別のアプリケーションでメモリー不足
が発生することはありません。


Joker  2005-10-15 03:11:10  No: 18062

masayanさん
回答有難うございます
そういうことだったんですね
薄々は感付いていたんですが・・・何か手はあるかなぁと思ったので^^;
まぁ、仕様というか、そういうもんだってことで。。。
本件、解決としますm(_ _)m


@123  2005-10-15 04:59:29  No: 18063

bluf=Joker?
ペンネームころころ変えるの、
それともレス乗っ取り?


うーむ  2005-10-15 05:59:04  No: 18064

ちゃんと読んだ方がいいですよ。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加