メモリの確保と解放

解決


bluf  2005-10-13 10:43:01  No: 18045  IP: 192.*.*.*

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

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


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

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

編集 削除
は?  2005-10-13 11:14:37  No: 18046  IP: 192.*.*.*

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

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

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

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

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

編集 削除
tu-ka  2005-10-13 11:42:24  No: 18047  IP: 192.*.*.*

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

編集 削除
Joker  2005-10-13 12:57:19  No: 18048  IP: 192.*.*.*

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

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

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

編集 削除
えーと  2005-10-13 13:32:29  No: 18049  IP: 192.*.*.*

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

編集 削除
Joker  2005-10-13 14:12:30  No: 18050  IP: 192.*.*.*

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

編集 削除
えーと  2005-10-13 14:48:26  No: 18051  IP: 192.*.*.*

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

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

編集 削除
えーと  2005-10-13 14:53:12  No: 18052  IP: 192.*.*.*

ReallocMem() の ヘルプより

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

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

編集 削除
Joker  2005-10-13 16:02:03  No: 18053  IP: 192.*.*.*

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

編集 削除
Joker  2005-10-13 16:07:23  No: 18054  IP: 192.*.*.*

それで・・・

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

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

編集 削除
@123  2005-10-13 16:34:22  No: 18055  IP: 192.*.*.*

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

編集 削除
@123  2005-10-13 17:03:22  No: 18056  IP: 192.*.*.*

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

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

編集 削除
Joker  2005-10-13 18:23:25  No: 18057  IP: 192.*.*.*

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

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

編集 削除
えーと  2005-10-13 18:37:06  No: 18058  IP: 192.*.*.*

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

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

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

編集 削除
@123  2005-10-13 20:53:27  No: 18059  IP: 192.*.*.*

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

編集 削除
Joker  2005-10-14 15:18:41  No: 18060  IP: 192.*.*.*

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

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

ほんと、すいませんです

編集 削除
masayan  2005-10-14 16:00:29  No: 18061  IP: 192.*.*.*

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

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

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

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

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

編集 削除
Joker  2005-10-14 18:11:10  No: 18062  IP: 192.*.*.*

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

編集 削除
@123  2005-10-14 19:59:29  No: 18063  IP: 192.*.*.*

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

編集 削除
うーむ  2005-10-14 20:59:04  No: 18064  IP: 192.*.*.*

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

編集 削除