喫茶XRAYトップページ

[スレッド全体
]

[9927] 今更きけない 動的配列…(いや、まぁ聞くんだけどさ)返信 削除
2016/5/15 (日) 19:47:35 taki
マスター 教えてください。
動的配列を使う度に、以下の記事が気になって心配になります。

------------------------------------------
Delphi/動的配列の罠
http://tobysoft.net/wiki/index.php?Delphi%2F%C6%B0%C5%AA%C7%DB%CE%F3%A4%CE%E6%AB

動的配列を「string のようなものだ」と思っていると痛い目に合います。
動的配列は参照カウンタつきポインタ

「代入したときは参照カウンタをインクリメント」してくれ、
「スコープが外れたときは、参照カウンタをデクリメントし、
  0になったら自動的に開放」はしますが、
「書き換えた時にコピー(copy on write)」はしてくれないのです。
------------------------------------------

説明はヘルプの「動的配列」のところに書いてあるそうなのですが、
Delphi XP4 Starter のHELPでキーワードに動的配列を入力しても説明が
見つかりません。

記事の説明のコードを見ると、単純に := で代入をするとポインタが
コピーされるので、「代入元と代入先が同じメモリーを参照します」と
読めるのですが、他に何か罠があるのでしょうか?

言葉で分からないのは「参照カウンタつきXX」の部分です。


[9928] Re:今更きけない 動的配列…(いや、まぁ聞くんだけどさ)返信 削除
2016/5/15 (日) 21:51:04 taki
> 言葉で分からないのは「参照カウンタつきXX」の部分です。

作成した手続きや関数内で定義した変数(ローカル変数)のスコープは
その手続きや関数内だけで有効ですよね。
その手続きや関数から抜け出した時点で変数は解放されるますよね。
ローカル変数には参照カウンタはないのでしょうか。

それじゃ、グローバル変数になると参照カウンタが必要になるのでしょうか?
複数の手続きがグローバル変数を参照する場合、複数の手続きの数だけインクリメント
され、それぞれの手続きから抜けるとデクリメントされると思えば良いのでしょうか?
そうなると、1個目の手続きでグローバル変数を使い、その手続きが終わったとたんに
変数が解放されてしまうことになるように思えるのですが。

Saraさん、タイトルをマネしてすみません。m(_ _)m


[9929] Re2:今更きけない 動的配列…(いや、まぁ聞くんだけどさ)返信 削除
2016/5/15 (日) 22:29:37 taki
それとも、参照カウンタはDelphiのメモリーマネージャがメモリを管理する
うえで必要な物で、プログラマは気にする必要が無い物でしょうか?

だから、「動的配列はポインタだ」という事だけ気をつけておけば
いいのでしょうか?


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82