トップページ⇒tech
1001コメント301KB

Borland Developer Studio 2006 No.10

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/10/31(火) 11:44:29
Borland Developer Studio 2006 ユーザーによる
Borland Developer Studio 2006 ユーザーのための統一雑談スレッドです。
Borland Developer Studio 2006 についての技術的な質問、不具合のQC 報告依頼も歓迎します。

(注)本スレには被害担当艦としての機能はありません。
Borland Developer Studio 2006 についての、批判・怒りのバグ告発はアンチスレ↓へどうぞ。
http://pc8.2ch.net/test/read.cgi/tech/1153353434/
0153デフォルトの名無しさん2006/11/10(金) 04:29:20
>>152
Borland Developer Studio 2006 アンチスレ
http://pc8.2ch.net/test/read.cgi/tech/1153353434/
0154デフォルトの名無しさん2006/11/10(金) 04:43:25
いちいちアンチがどうだこうだとか出てきて、おまえ目障りなんだよな >153
0155デフォルトの名無しさん2006/11/10(金) 04:46:15
はいはい。まんせ君ご苦労さま。
でも、まんせって全然役に立ってないよね。

多少でも役に立っている人たちに文句を言う資格なし。
0156デフォルトの名無しさん2006/11/10(金) 06:13:32
(たまたま)役に立ったからといって,大きな顔する権利も無し
0157デフォルトの名無しさん2006/11/10(金) 08:25:55
>>151
つまりガンはあいつか
0158デフォルトの名無しさん2006/11/10(金) 10:18:24
いちいち釣られるな。
0159デフォルトの名無しさん2006/11/10(金) 11:10:13
1月の演奏会に向けて、練習を本格化していかなければならない時期になってきました。
Delphiのことなどほっときましょう
0160デフォルトの名無しさん2006/11/10(金) 12:06:34
JBuilder にも期待してるんだが、どうなったのだろう。

確か年末だよね。
http://www.atmarkit.co.jp/news/200605/26/borland.html

Ruby on rail 用IDE も出ないかな。
0161デフォルトの名無しさん2006/11/10(金) 12:28:34
>確か年末だよね。
日本語化の予定が無いから宣伝できないみたいだね。
0162デフォルトの名無しさん2006/11/10(金) 13:24:30
英語でもいいけど。
0163デフォルトの名無しさん2006/11/10(金) 13:26:38
つかBDN の英語 Java にも情報は載ってないし
ブログも書いてない。
0164デフォルトの名無しさん2006/11/10(金) 13:33:02
今まで JBuilder と言われていたものは無くなった。ってのは知ってるんだよね?

来週のデベロッパーキャンプに参加してデモを見たら?
一緒にロードマップの変更も発表するようだし
0165デフォルトの名無しさん2006/11/10(金) 13:35:49
情報統制しておいて、華々しく発表か。
なんか古いんだよね。
他所はリリース前から、ブログで盛り上げるのに。
0166デフォルトの名無しさん2006/11/10(金) 13:59:16
どこが”華々しく”なんだか・・・
0167デフォルトの名無しさん2006/11/10(金) 14:00:18
>華々しく発表か。
じゃないんだってば。
... デモと同時にロードマップ更新のお知らせから読み取れるのはなんだ?

延期だよ
0168デフォルトの名無しさん2006/11/10(金) 14:05:06
例年通りなら年末に Delphi の新版がでるはずなのだが,Highlander が来年夏に延びたため
急遽 Peloton を先に出すと決めた。がやってみたら Eclips 側の予定にうまく合わず翻訳版が
まず延期。そしてとうとう Peloton そのものが来年頭に行った。

0169デフォルトの名無しさん2006/11/10(金) 14:25:31
> 延期だよ

あらら。
嘘かホントか分からんが、Eclipse 上にIDE を作るリスクというのもゼロじゃないわけだ。

やっぱり自前路線しかないのかねー。
0170デフォルトの名無しさん2006/11/10(金) 14:27:26
小さな会社でも、VS2005やEclipseを利用して、上手くIDEを作ってるのにねー。
0171デフォルトの名無しさん2006/11/10(金) 15:00:54
>>168
> Highlander が来年夏に延びたため

えぇー!
0172デフォルトの名無しさん2006/11/10(金) 15:03:16
いや、待て。
前もこのパターンで騙されたぞ。
0173デフォルトの名無しさん2006/11/10(金) 17:16:27
とりあえず,はらたいらに全部
0174デフォルトの名無しさん2006/11/10(金) 17:28:57
はらたいらに?なんだそれ
0175デフォルトの名無しさん2006/11/10(金) 17:38:44
ニュースも見ろよな >174
http://www.asahi.com/obituaries/update/1110/003.html
0176デフォルトの名無しさん2006/11/10(金) 21:34:29
>>135
> ただいまスタジオ、音声収録中

文句ある?
0177デフォルトの名無しさん2006/11/10(金) 22:55:54
Allen Bauerのblogに興味深いアーティクルがあったので訳してみた。
翻訳の才能がないのに絶望しかかったけどとりあえずレベルのものができたので
勝手ながら公開する。気になる部分やもっといい訳があればご指摘願いたい。
とりあえず転載自由で。

ttp://blogs.borland.com/abauer/archive/2006/10/31.aspx
2006年10月31日
Assignedか、not Assignedか、それが問題だ...

news://forums.borland.com/borland.public.delphi.non-technical ニュース
グループに、Assignedが単なるnilとの検査よりもよいのかどうかに関するかな
り興味深い議論があります。おなじスレッドには私が他のポストでカバーして
もよいようなFreeAndNilについての取り留めのない議論もあります。Assigned
については、それが導入されたいくつかの理由を明らかにしたいと思いました。
これはまた(あなたが沼に出会ったときにそれをふさいでいる)覆いの下でDelphi
(BDS) IDEのVCLデザイナの内部がどのように動いているのかを覗き見るという
ことでもあります。

'if PointerVar <> nil then'はポインタ変数が意味のある値を保持しているか
どうかをチェックするために使用されてきました(もちろん以前にnilで初期化
されたと仮定すればですが)。このステートメントは適度によいコードを生成し、
明確で、意図した目的によくかないます。ではなぜ"Assigned"を追加したので
しょうか?Delphi 1において我々は"メソッドポインタ"あるいは"クロージャ"
とも呼ばれる概念を言語に導入しました(実際に純粋な意味で完全な"クロージャ"
ではありませんが)。メソッドポインタは単に実行時にメソッドの実体、そして
これは非常に重要ですが、オブジェクトの特定のインスタンスに、結び付けら
れます。実際のオブジェクトインスタンスの型が任意であるという点は興味深
い指摘です。実行時に要求される型のチェックはメソッドシグネチャがメソッ
ドの型に適合するかどうかだけです。これによりDelphiのデリゲーションモデ
ルはうまくいきました。
01781772006/11/10(金) 22:57:44
OK、Assignedに戻りましょう。ネイティブコード(Win16、Win32、そして来るべ
きWin64の実装で)のメソッドポインタの実装は2つのポインタで構成されます。
一つはメソッドのアドレスを、もう一つはオブジェクトインスタンスを指しま
す。簡単な"if methodpointer <> nil then"ステートメントは結局どちらのポ
インタもnilであることをチェックするということになり、論理的に見えます
(いいですか?)。そのとおり。しかしここにはちょっとした障害があります。
デザイン時にネイティブVCLフォームデザイナは帽子からいくつかのトリックを
取り出します。我々にはコンポーネントのメソッドポインタの実体に値を割り
当てる何らかの方法が必要でしたが、しかしコンポーネントは何が割り当てら
れたのかを実際には確認せず、すぐにメソッドを呼び出そうとします(ば〜ん!)。
Assignedの話に入ります。Assignedという標準関数を加えることによって、我々
は"<> nil"の動作を保護してひねりを加えることができるようになりました。
大胆にもあなたが検証できるとおり、Assignがメソッドポインタの2つのポイン
タのうち1つだけをチェックするだけであることがわかります。もう1つのポイン
タは全くテストされません。IDEのオブジェクトインスペクタ上でメソッドをメ
ソッドポインタに"割り当てる"ときには、デザイナは実際にはメソッドポイン
タ構造体の(割り当てられず、テストされない)もう一つのポインタに内部的に
生成したインデックスを詰め込む、ということが行われています。そこであな
たのコンポーネントがメソッドポインタを通して呼び出しを行う前に
"if Assigned(methodpointer) then"の判定を行うならば、コンポーネントのコー
ドはデザイン時におかしな振る舞いをすることはないでしょう。そこでDelphi 1
以降、我々は熱心に"Assignを使え...Assignを使え...Assignを使え..."とみん
なの頭に吹き込んできました。それは機能してきたと思います。コンポーネン
トの作者にとって、メソッドポインタを通して呼び出しを行う前にAssignedを
使用してその値をテストすることは重要です。それ以外のケースでは多少泥臭
01791772006/11/10(金) 22:58:33
く、あまり明確であるとはいえません。個人的には未だに"<> nil"パターンを
必ず使用しています。それはおそらく私が"古い"からかもしれませんが、わか
りません。しかし、上にあげたような理由から、メソッドポインタをテストす
るときには常にAssignedを使用しています。

なぜ通常のインスタンスの参照やポインタについても常にAssignedを使用べき
なのかについて、いくつかのかなり変わった根拠を見てきました。私が見かけ
た変わった理由の1つは、"将来、'nil'が全て0のポインタ値以外に定義される
かもしれない"というものでした。そのようなことになったらnilの"値"もまた
その状態を反映して変更されるとは思いませんか?別の要素としては、一体ど
うして非0の値をnilとして使用する必要があるというのでしょうか?PChar
(char *)が常に0で終端されるように、nilもまた常に0であるべきだということ
は、私にとっては、コンピューティングにおける不変の法則の一つです。さて、
Pascalでは必ずしも'nil'が0である必要はありませんが、0であることは便利で
一貫していて、新しいプラットフォームやアーキテクチャにおいて変更が要求
されるならば、非常に切実な再定義の理由が必要である、ということがわかり
ました。いくつかのポイントについて、その他の不明瞭な擬似事実を明らかに
し、Delphi、VCL、IDEに関係するいくつかの決定とデザインの背後にある論理
を掘り起こすために、タイムマシンで時間をさかのぼることにします。さしあ
たり、"Assigned(someinstance)"も"<> nil"もお咎めなしです...しかしメソッ
ドポインタでは常に"if Assigned(methodpointer) then"です!
01801772006/11/10(金) 22:59:38
ttp://blogs.borland.com/abauer/archive/2006/11/01.aspx
2006年11月01日
例外安全

1992年の終わりか1993年か、そのころに我々にはジレンマがありました。Turbo
Pascal(じきにDelphi言語のベースとなりました)に例外を追加しようとしてい
ました。Windows NTは本格的に開発が行われていました。この新しいOSには構
造化例外(Structured Exception Handling/SEH)と呼ばれる新式のものがありま
した。ここにおけるジレンマとはなんだったのでしょう?Delphiの最初のリリー
スがWin16としても知られるWindows 3.1がターゲットであったということを思
い出してください。ここにはOSレベルでサポートされたSEHはありませんでした。
またWindows NTはマスマーケット向けのコンシューマベースのOSとしてリリー
スされる予定ではありませんでした。さて、なにが問題なのでしょう?単に言
語にSEHを実装して先に進みましょう。問題は"安全"に関するものでした。もち
ろん、そこで我々は16bit版のDelphi言語にSEHの特定のインプリメンテーション
を追加しました。例外はあなたのコードをより安全にするのではないでしょう
か?OK、ここで鈍感で少々曖昧な態度をとることにしましょう。

我々が直面していた基本的な問題は部分的に生成されたオブジェクトという概
念でした。オブジェクトのコンストラクタの途中で例外がライズされたらどう
なるでしょうか?コンストラクタの実行から、例外ハンドラが実行され、デス
トラクタが呼び出される時点までどれだけ離れているのかわかりますか?コン
ストラクタは順調にフィールドを初期化し、他のオブジェクトを生成し、メモ
リバッファをアロケートし、などなど…。突然、ドーン!これらの操作のうち
の一つが失敗します(ファイルを開けない、コンストラクタのパラメータに不正
なポインタが渡される、など…)。コンパイラがコンストラクタの実行を囲んで
暗黙の例外ハンドラを挟み込んでいるため、例外を捕捉して即座に忠実にデス
トラクタを呼び出します。一旦それが完結し、部分的に生成されたオブジェク
トが破棄され、リソースが解放されたら、例外は継続、言い換えれば再生成さ
れます。このシナリオにおける問題は、デストラクタにはなぜ呼び出されたの
01811772006/11/10(金) 23:00:26
かの手がかりが本当に全くないということです(確かに例外が作動していること
はわかりますが、だからどうだというのでしょう?)。インスタンスが完全に生
成されたのか、そうでないのか、どれだけ生成が進行していたのか、デストラ
クタにはわかりません。

解決策は非常に簡単で、同時にいささか賢明であることがわかりました。Delphi
の全てのクラスには関連付けられた仮想メソッドテーブル(VMT)があるため、そ
れぞれのインスタンスはそのテーブルを指すように初期化される必要がありま
す。Delphiのクラスではコンストラクタ内から仮想メソッドを呼び出すことを
許しているため、コンストラクタが実行を許可する前にVMTへのポインタは初期
化されます。コンストラクタが実行される前にVMTポインタがセットされる必要
があるなら、なぜ完全なインスタンスを既知の状態に初期化しないのでしょう?
これがまさに行われることです。完全なインスタンスは0に初期化され、VMTポ
インタがセットされ、インタフェースを実装するのであればそれらのVMTポイン
タもまたセットされます。オブジェクトのコンストラクタのユーザコードが実
行開始される時点で、インスタンスのデータは既知の状態になっていることを
知っておいてください。このことを利用して、デストラクタは世界がめちゃめ
ちゃになる前に初期化のシーケンスでどれだけものが確保されたのかを容易に
見分けることができます。昨日の記事でFreeAndNilプロシージャについて触れ
たのを覚えていますか?注意すべき別の項目は非仮想のTObject.Freeメソッド
です。インスタンスのフィールドが非nilまたは非0の値を含むならば、初期化
が成功裏に行われたに違いなく、逆初期化を行っても構わないという想定をし
てもいいでしょう。これはコンストラクタ内でメモリの確保やオブジェクトの
生成を行う場合には(さらには他のいかなるオブジェクトのメソッドでも)さら
に重要になります。有効なポインタがいつそのフィールドにあるのかをデスト
ラクタは知っていなければなりません。つまり非nilの値は、メモリを解放しオ
ブジェクトを破棄することを意味します。
01821772006/11/10(金) 23:07:01
ユーザが常に"if FField <> nil then FField.Destroy;"とするのを覚えていな
ければならないというのは非常に面倒であり間違いの元でもある、ということ
もまた理解しました。TObject.Freeの話に進みましょう。System.pasを開いて
Freeの実装を見てみると、"if Self <> nil then Destroy;"と単純です。これ
でnilや確保していないインスタンスに対してFreeを安全に呼び出すことができ
ます。なぜならメソッド内でチェックが行われるからです。必要なのは
"FField.Free;"だけで、これであなたのデストラクタは"例外安全"となります。
GetMemで確保したメモリでも同じことです。FFieldがnilであっても
"FreeMem(FField)"を安全に呼び出すことができます。話を戻します。最後に、
string、interface、動的配列、バリアントのような一部の"管理型"ではコンパ
イラが生成するメタデータを使って自動的に処理される、ということに注意し
てください。オブジェクトのインスタンスのメモリが解放される直前に、イン
スタンスと、解放の方法がわかるようにフィールドの型とオフセットを含んだ
メタデータテーブルを受け取るようなRTL関数が呼び出されます。繰り返しにな
りますが、それぞれのfieldがnilであれば、何もする必要がなく単に通過する
だけです。

FreeAndNilについてはどうでしょう?鋭いあなたはこのプロシージャの実装が、
渡された参照にまずnilをセットし、それからインスタンスを破棄しているとい
うことに気が付いたかもしれません。実際にはNilAndFreeという名前であるべ
きではないでしょうか?ええ、そうかもしれません。しかし言いにくく、同様
に混乱を招きます。"じゃあ最初に参照にnilをセットして...どうやって破棄す
るんだ?"ではなぜこのような実装なのでしょう?例外安全が大きな理由です。
別のかなり不鮮明な理由は密接にリンクされたオブジェクトと関係しています。
他のオブジェクトを順番にリストに保持しているオブジェクトが"オーナ"オブ
ジェクトへの逆参照を持っていると思いますか?オブジェクトが破棄される順
番に依存していることで、他のオブジェクトに破滅が迫っていることを知らせ
01831772006/11/10(金) 23:08:47
る必要があるかもしれません。オーナと所有されているオブジェクトが密接に
リンクしているので、存続期間を通してお互いにメソッドを直接呼び合います。
しかし破棄中は、破棄を投げている間に有無を言わさず他のインスタンスのメ
ソッドを呼び出すのは非常に危険であるかもしれません。オブジェクトを破棄
する前にインスタンスポインタをnilにセットすることで、単にnilかどうかを
チェックすることでもう一方のインスタンスを破棄している間にメソッドが呼
び出されないことを確実にすることができます。

ということで、あなたのオブジェクトを"例外安全"にするいくつかの秘訣と、
FreeAndNilを使ったほうがよいという2つのヒントが得られました。覆いの下を
覗き込んでコードを試すことで、実装の理由と方法をより理解できるようにな
ります。したがっていつでも"if FField <> nil then FField.Destroy"パター
ンを使用することができますが、"FField.Free;"を呼び出せばなぜ全ての作業
が行われるのでしょうか?このパターンでは"if FField <> nil then
FField.Free;"や"if Assigned(FField) then FField.Free;"は冗長です。

以上

3本目のtry...finallyはまた週明けにでも。
0184デフォルトの名無しさん2006/11/10(金) 23:22:46
乙。
2ch はログが流れてしまうので、ブログかWiki に転載した方が良いね。
0185デフォルトの名無しさん2006/11/11(土) 00:45:08
誰か読んだやつ3行で説明しろ
0186デフォルトの名無しさん2006/11/11(土) 01:26:06
まぁ、Delphi はよく考えてつくってあるから
おまいら安心して Assigned() やら FreeAndNil()
つかうべし、ってことだ。
0187デフォルトの名無しさん2006/11/11(土) 03:49:21
WideString型の変数の値をString型の変数に代入すると自動的に型変換されるけど、
やっぱ、コンパイラでWideCharToMultiByteとかのWindowsAPIの呼び出しに置き換えられてるんだよな??
0188デフォルトの名無しさん2006/11/11(土) 03:52:50
system ユニットの変換関数呼び出し。>187
0189デフォルトの名無しさん2006/11/11(土) 05:16:51
>>177-183
転載しておいた。

http://delwiki.info/?%BB%F1%CE%C1%2FAssigned
http://delwiki.info/?%BB%F1%CE%C1%2F%CE%E3%B3%B0%B0%C2%C1%B4%C1%F5%C3%D6

問題がある場合は、削除してくださいな。
01901772006/11/11(土) 12:47:56
>189
ありがとん。フォーマットを多少いじって見やすくしといた。
あとは明白な誤訳や意味不明なところの修正など、気がついた点があれば指摘よろしく>all。
0191デフォルトの名無しさん2006/11/11(土) 12:55:09
長い割に内容の薄い記事やね
01921772006/11/11(土) 13:52:37
>191
テクニカルなアーティクルというより読み物に近いからね。昔話というか。
翻訳もだめだめだし…。
0193デフォルトの名無しさん2006/11/11(土) 14:11:15
>>192
アレンの文書は、まず日本語にして、そこから何が書いてあるか考えないと
いけないから、大いに助かる。

翻訳は良く出来てるほうだよ。何が書いてあるか、分かるもの。
0194デフォルトの名無しさん2006/11/12(日) 11:47:05
> 何が書いてあるか、分かるもの。

わはは、最高の褒め言葉
01951772006/11/12(日) 12:15:10
>193
そういっていただけるとうれしい。
>194
いや、まじで1行1行はなに書いてあるかわかるのよ。でもつなげると…。
でも大意はわかると思うし、それなりに興味深い内容だと思ったので。
もうちょっと出来がよければ藤井さんに売り込んだんだが…。
転載、2次利用大歓迎なのでまともに直して公式に載せてくれ>某の中の人
0196デフォルトの名無しさん2006/11/12(日) 22:11:28
音楽話も悪くないけど、こんな話も載せてくれればいいのにね・・
0197デフォルトの名無しさん2006/11/13(月) 04:12:35

自分らのアホさ加減に気が付けよ
間抜け

0198デフォルトの名無しさん2006/11/13(月) 06:26:57
FreeAndNilのある理由が分かった。
逆にnilを先に入れる事よる不都合だって有り得るよね。
こんなの。

procedure HogeProc;
begin
 ShowMessage(Form1.Name);
end;

procedure Form1.Destroy;
begin
inherited;
HogeProc;
end;
01991982006/11/13(月) 06:33:10
既に解放処理が行われているかもしれず、オブジェクトとして不完全だから
nilを代入するのか。
>198は忘れて。
0200デフォルトの名無しさん2006/11/13(月) 08:01:27
200
0201デフォルトの名無しさん2006/11/13(月) 08:01:46
>>199
実際あるよ
FreeAndNilではうまくいかず
a.Free;a:=nil;でうまくいくことは
0202デフォルトの名無しさん2006/11/13(月) 12:26:38
プロパティを渡そうとしているとかいう話でなく?
0203デフォルトの名無しさん2006/11/13(月) 20:21:06
まーくん こと山岸昇のブログ
ttp://blog.goo.ne.jp/nobol-blog

精神を病んでいたのね...
0204デフォルトの名無しさん2006/11/13(月) 22:39:59
病んでる者同士、仲良くしなさいよ>VB厨。
0205デフォルトの名無しさん2006/11/13(月) 22:58:09
相変わらず製品と同じくらいひどいスレだな
0206デフォルトの名無しさん2006/11/13(月) 23:04:58
まったくVB厨って奴はw
0207デフォルトの名無しさん2006/11/14(火) 07:58:18
>>202
いや。例えばスレッド関係とか。
02081772006/11/14(火) 21:23:24
http://blogs.borland.com/abauer/archive/2006/11/03.aspx
2006年11月03日
try...finally

ここ数日、例外に関して多少の混乱があることを示すようないくつかの興味深
いコメントがありました。より明確にはtry...finally構文です。"try...finaly"
の使用に関して、私を立ち止まらせ、なぜそのようにするのか不思議に思うよ
うな、いくつかのかなり興味深いねじれがあるようでした。例外を伴なうプロ
グラミングでは、ほとんど全ての場所でいきなり制御が離れた場所に移される
ということを常に意識していなければなりません。色々な意味で、マルチスレッ
ドのシナリオでどうするのかと非常に似た問題についてアプローチし、考える
必要があります。どちらの場合でも、潜在的な2つ(あるいはマルチスレッドで
はそれ以上)のコードの通過経路を常に意識のうちに留めておく必要があります。
一つは簡単で、プログラムの全体的なロジックと意図を定義するコード中の文
をあなたが書いている順番です。もう一つの、しばしば忘れられているコード
経路は、例外が実行される経路です。

例外がライズされた(C++や類似の言語の用語では"投げられた")とき、その動作
の背後では多くの隠された作業が行われています。プラットフォームや言語に
依存する傾向があるため、実際に何が行われているのかの詳細には立ち入るつ
もりはありません。プログラマの視点から何が起きているのかや具体的な
"try...finally"構文について焦点を合わせていきます。"try...finally"ブロッ
クについて考える一つの方法は、第2のコード実行経路で"邪魔をされる"という
プログラマのやり方です。しかしそこでは通常のコード実行経路で"邪魔をされ
る"ことから特異です。全体的な見地では、例外を使用するプログラミングにお
いて"try...finally"ブロックは最も多く使用される(そしてしばしば誤用され
る)ブロックの形式です。典型的なアプリケーションにおける"try...finally"
ブロックと"try...exception"ブロックの比率は100:1のオーダであるとしてお
きましょう。しかしなぜそれを使い、なにがよいのでしょう?リソース管理の
02091772006/11/14(火) 21:23:55
ためです。メモリ、ファイル、ハンドル、ロック、などなど…これらはあなた
のアプリケーションが使用したり関係したりする色々なリソースの例です。
"try...finally"ブロックの核心は、アプリケーションの取る実行経路に関わら
ず確保したリソースを適切に返却することを保証することにあります。

それでは"try...finally"ブロックの一般的な誤用をいくつか見て、綿密に調べ
てみましょう。

var
Obj: TMyClass;
begin
try
Obj := TMyClass.Create;
...
finally
Obj.Free;
end;
end;

ここには微妙な問題があります。最初に正常な実行フローを追ってみましょう。
制御がtryブロックに入り、TMyClassのインスタンスがアロケートされてコンス
トラクタが呼び出されます。制御が戻り、ローカル変数Objに格納されます。い
くつかの処理がObjに対して行われ("..."の部分)、制御がfinallyブロックに
入ってObjのインスタンスが解放されます。ここまでは大丈夫でした。いいです
ね?つまり、メモリが確保され解放され、TMyClassのインスタンスが必要とし
ているその他のリソースとともにヒープもうまく処理されています(適切に設計
されたクラスなら、です)。

さて、制御のフローのその他の可能性を見てみましょう。制御がtryブロックに
入り、TMyClassのインスタンスがアロケートされてコンストラクタが呼び出さ
02101772006/11/14(火) 21:24:31
れます。ここにものすごくうまくいかないかもしれないものがあります。例外
を使用したプログラミングでは、コンストラクタの呼び出しの間に何かが起こ
る可能性はほとんど無限にあります。最も明白なのは、メモリマネージャが新
しいインスタンスのデータを保持するだけの十分なメモリをヒープ上に確保で
きないというケースです。"Out of Memory"例外がライズされます。おい、でも
finallyブロックに例外の制御フローが渡されるのだからOK。でしょ?はあ、そ
のとおりです。メモリがアロケートされなければ、コンストラクタも呼び出さ
れず、ローカル変数Objにも格納されず、そして制御がfinallyブロックに入っ
てその中身は…あー、"Obj.Free;"です。見ましたか?ええ、そのとおり、Obj
の参照は適切に設定されていません。このため、"Obj.Free;"の呼び出しはあな
たのアプリケーションの健康にはよくありません。おそらく元々の例外に取っ
て代わって(多くの場合もっと致命的で扱いにくい)別の例外がライズされるで
しょう。

ではどのようにこれを修正すればよいのでしょう?はい、わかっています。も
しObjの参照をnilに事前に初期化("Obj := nil")していおいたらどうでしょう?
確かに。そのようにすることもできますが、コードに別の行を追加することに
なります。どうすればどちらの実行経路を通過したのかに関わらず常に制御が
finallyブロックに渡されることを保証するようにこのコードを修正できるで
しょう?実際には非常に簡単です。同じブロックを微妙に変更してあります。

var
Obj: TMyClass;
begin
Obj := TMyClass.Create;
try
...
finally
Obj.Free;
end;
end;
02111772006/11/14(火) 21:26:19
しかしこれでTMyClassのインスタンスの生成は保護されなくなります!それは
必要ありませんが、理由を検討してみましょう。例外安全とAssignの仕様に関
する私の以前のいくつかのポストで、オブジェクトのコンストラクタが実行さ
れている間にもし例外がライズされると、デストラクタが自動的に呼び出され、
オブジェクトは解放されて例外の実行の継続が可能になるという事実を暗示し
ました。これは本質的に2つの主要な領域でうまくいかなくなるかもしれないと
いうことです。一つはインスタンスのためのメモリを実際にアロケートしよう
とする間です。メモリマネージャがインスタンスを保持できるだけの大きさの
ブロックを見つけることができないと、"Out of Memory"例外をライズするで
しょう。実際にはインスタンスがアロケートされなかったので、コードの
"Obj.Free;"の行は実行する必要が全くありません。try...finallyブロックに
入らなかったので、Obj.Freeは決して呼ばれないでしょう。もう一方のうまく
行かないかもしれない場所はオブジェクトのコンストラクタの中です。この場
合はメモリマネージャがメモリをアロケートし、インスタンスをセットアップ
するために制御がコンストラクタに渡されます。ここで何か致命的なことが発
生したら、デストラクタが自動的に呼び出されてインスタンスのメモリが再利
用のためメモリマネージャに返却されるということを、これらの過去のアーティ
クルから知っています。オブジェクトは解放されており、同様に制御はtry...
finallyブロックには入っていかないため、"Obj.Free;"の行は決して実行され
ません。これらのシナリオのどちらにおいても、TMyClassのインスタンスに関
係したりソースは適切に扱われているため、ローカル変数Objの参照に触れる必
要はないのです。メモリのアロケートが成功し、コンストラクタを実行し終わっ
たら、制御が戻ってきてローカル変数Objに設定され、その後で制御はtry...
finallyブロックに入っていきます。次に何が起こるかに関わらずObjで参照さ
れるTMyClassのインスタンスがきちんと解放されているようにというあなたの
変わらない要求はこれで満たされます。
02121772006/11/14(火) 21:28:01
そのほかにも多くの興味深いtry...finallyおよびtry...exceptブロックを使用
するにあたっての"ねじれ"をここ数年間見てきました。上記のケースはもっと
も共通の誤りとして記憶の中でも目立っています。これ以外のいくつかのケー
スを続くポストで書いていくつもりです。例外に関して自信がない特定の共通
のイディオムやパターンについての質問があるなら、コメントをポストしても
らえれば、将来のポストでそのことについて書くつもりです。

---
以上意味が通りにくいけど参考に。
wikiも更新しておいた。

ttp://delwiki.info/?%BB%F1%CE%C1%2Ftry...finally
0213デフォルトの名無しさん2006/11/14(火) 21:55:20
ブログに長々と書く暇があるなら、その分ヘルプをちゃんとしろ、と思う今日子の語呂
0214デフォルトの名無しさん2006/11/14(火) 21:57:00
人の足を引っ張ることしかできない、実行力のないアンチw
0215デフォルトの名無しさん2006/11/15(水) 00:29:50
>>213

最近、ヘルプなどのドキュメント要員をかなり増員しているようだぞ。
0216デフォルトの名無しさん2006/11/15(水) 01:34:56
 2chでアンチに成り果て自作自演を繰り返す身障
 いっそ死んだらどうだ
0217デフォルトの名無しさん2006/11/15(水) 02:08:36
C++でソースに日本語を使うと、いろいろおかしくなるのは俺だけ?

void hoge()
{
// ほげほげ
}
//---------------------------------------------------------------------------
void hoge()
{
// ほげほげ
}
//---------------------------------------------------------------------------

こんなかんじで200行くらいコピペしてくと・・・もう死にたい
0218デフォルトの名無しさん2006/11/15(水) 03:31:14
>>209は未初期化云々のワーニングが出るよ。
0219デフォルトの名無しさん2006/11/15(水) 06:31:16
おまえだけ >217

>コピペしてくと・・・もう死にたい
肝心なところを省略するなよ
0220デフォルトの名無しさん2006/11/15(水) 06:34:40
>>209は未初期化云々のワーニングが出るよ。
そのワーニングが出る理由を説明しているとおもわれ
0221デフォルトの名無しさん2006/11/15(水) 06:34:57
>>208
眠い頭で考えた改善点

> "try...finally"ブロックについて考える一つの方法は、
> 第2のコード実行経路で"邪魔をされる"というプログラマのやり方です。
"try...finally"ブロックについて考えなければならない唯一の事は、
プログラマのやり方によっては第2のコード実行経路の"邪魔をする"という事です。

> しかしそこでは通常のコード実行経路で"邪魔をされる"ことから特異です。
しかし、(第二だけでなく)通常のコード実行経路の邪魔にもなるという点もユニークです。

> "try...finally"ブロックの核心は、
"try...finally"ブロックの醍醐味は

> ここにものすごくうまくいかないかもしれないものがあります。
ひどい狂いが生じる可能性があるのは、ここです。

> しかしこれでTMyClassのインスタンスの生成は保護されなくなります!それは必要ありませんが、
でも、これじゃあTMyClassのインスタンスの生成は保護されてないじゃないか!そんなの必要ありません。

> これは本質的に2つの主要な領域でうまくいかなくなるかもしれないということです。
これによって狂いが生じる可能性があるのは、大きく分けて2つです。
0222デフォルトの名無しさん2006/11/15(水) 06:35:18
トロルテックが DevCo 買収決定
0223デフォルトの名無しさん2006/11/15(水) 06:53:21
売却は諦めた模様。

DevCo はCodeGear 社として2007年初頭に分社化するとの事。
CEO はBen Smith 氏。
http://biz.yahoo.com/bw/061114/20061114006381.html?.v=1

0224デフォルトの名無しさん2006/11/15(水) 06:55:44
ちぇ。燻製のニシンを振りまこうと思ったのに .. >223
0225デフォルトの名無しさん2006/11/15(水) 07:28:40
                へ、、
               / {_ ク
            ,=- く__,,/
              /   /     _
          /  /     _〃― ヽ
         /   /ヘ     _/ | | =!|= }lヽ     ウォォォォォォルハァイルブルィィィィィトァァァァァニィア!!
        r'   く彡 \r'´{ ∧ rっ /  |ヽ-、
         \    ""''''`l /ヘ`,二´ミ、ノ丿丿)
          /\    | ´   | |  | |\_ノF== 、__
         /;:;:;:;:ヽ  /   l   | |  | |  \|| | | | | ||
         /;:;:;:;:;:;:|     r―''\ ,'⌒i|       || ||  |
         /;:;:;:;:;:;:;:;:|     ||    ヽ__ノ       || ||   ヘ
          /;:;:;:;:;:;:;:;:;:;:|    q====||ヽ==o || ||   ヽ
       /;:;:;:;:;:;:;:;:;:;:;:;:|      ||       || ヽ   || ||     \
   /| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|\
  /  |                                   |  \
/    |                                   |   \
0226デフォルトの名無しさん2006/11/15(水) 07:45:21
そう言えば、売却で「買ってくれるところがあるのは価値がある証拠」とか
力説してたのがいたなぁ・・・・いま、どう思ってるんだろ?
0227デフォルトの名無しさん2006/11/15(水) 07:52:32
やはり、日本でイベントをやる前に何かが起こる...

知らされてないんだろうなぁ
0228デフォルトの名無しさん2006/11/15(水) 07:53:41
うはは。今までdelphiなどにまわす人的リソースつまりは金がないから、あんなひどい
製品だてたのに、分社化で何が変わるんだ??

わらえる。Delphi終わった。
0229デフォルトの名無しさん2006/11/15(水) 07:56:50
www.codegear.com
もうできてるし
0230デフォルトの名無しさん2006/11/15(水) 08:06:37
>>228
クパティーノ(都会派) vs スコッツヴァレー(田舎派)の争いに
ようやく結論が出たというのは良いことだよ。
0231デフォルトの名無しさん2006/11/15(水) 08:24:14
だが、都会派クパティーノは売れる製品を一つも持っていない

0232デフォルトの名無しさん2006/11/15(水) 08:25:48
だが、都会派クパティーノは売れる製品を一つも持っていない

0233デフォルトの名無しさん2006/11/15(水) 08:26:46
げ。二度書きスマソ

ML は、また無反応でしょう。

0234デフォルトの名無しさん2006/11/15(水) 08:41:39
>>230
横浜 vs 湘南みたいなものかね。
0235デフォルトの名無しさん2006/11/15(水) 08:50:15
>横浜 vs 湘南みたいなものかね。
うーん、わかんない。別のにたとえると?
0236デフォルトの名無しさん2006/11/15(水) 08:51:28
CodeGear RubyBuilder, PythonBuilder そして AjaxBuilder かぁ...
0237デフォルトの名無しさん2006/11/15(水) 08:51:33
三鷹 vs 多摩ニュータウン
0238デフォルトの名無しさん2006/11/15(水) 08:55:29
BDS2006発売の時は、投資家には会社を売却しないとか、将来の安心感を必死に訴えて、
BDS2006を買わせようとしてたが、早くもこれ。
俺は2006買わなかったけどさ。
0239デフォルトの名無しさん2006/11/15(水) 08:57:56
>投資家には会社を売却しないとか
結局投資家には売却しなかった訳だし。

このばあいの投資家は、日本でいうところのハゲタカファンドで、おいしいところだけ
食い散らかしてポイする連中。
0240デフォルトの名無しさん2006/11/15(水) 08:58:36
>>238
将来性という点は分からなくなったが
ドナドナされないってのは、良い事なんじゃね。

とりあえず即死・と殺は回避して、あと2・3年はいけそうなら
Delphi 使いにとってはまずまずと行った所では。
0241デフォルトの名無しさん2006/11/15(水) 09:00:39
まぁ、投資家には売却しなかったけど、問題は金だよ。分社化だけで、どっから
開発資金は沸いてでてくるのかな?
つまり、結局は何も変わってないってことか。
0242デフォルトの名無しさん2006/11/15(水) 09:01:29
どちらかというと、ALM 構想が失敗に終わったクパティーノ側が泣きついたんじゃないの?
StarTeam は悪くないけど、それがどれだけ売れるかといったら...
0243デフォルトの名無しさん2006/11/15(水) 09:04:53
>>241
> 問題は金だよ。

ALM に吸い取られなくなったので、現状でも自由に使える金は増えてるんじゃないか。
別会社になったという事で、資金調達も自己責任で出来ると。
0244デフォルトの名無しさん2006/11/15(水) 09:08:50
>>242
まあ、買収した会社がもともと持っていた市場・地域ではそれなりなんじゃね。

Borland ブランドの下で、バラバラの会社が勝手に商売しているというのが、
今のBorland の姿かな。
0245デフォルトの名無しさん2006/11/15(水) 09:10:30
だって、CodeGear の持つ製品以外は、全部外から買ってきた製品。だろ?
0246デフォルトの名無しさん2006/11/15(水) 09:11:09
blog の名前かえるの? > 244
0247デフォルトの名無しさん2006/11/15(水) 09:13:53
そういえば新会社もB で始まるはずじゃなかったのか!
0248デフォルトの名無しさん2006/11/15(水) 09:15:23
またおまえはだまされたわけだが > 247
0249デフォルトの名無しさん2006/11/15(水) 09:17:16
まあ大した被害があるわけじゃないし、いいよ。
0250デフォルトの名無しさん2006/11/15(水) 14:47:46
CodeGearよりはTurboGearの方がよかった。
0251デフォルトの名無しさん2006/11/15(水) 15:01:11
Turbo そのものは,歴史にとどめたいんだろ
0252デフォルトの名無しさん2006/11/15(水) 16:10:04
結局ロードマップの変更は無し?
■ このスレッドは過去ログ倉庫に格納されています