
スマートポインタはすごいな
さすがプログラム書いてる時はネタに欠かさないぜ!
とりあえずboost::shared_ptrがすごいです。クラスのメンバで古いポインタを保持してるところに新しいポインタを上書き代入すると、古いポインタは一体どうなるんだろうっていうかこれdeleteできないとやばいよって思ってたんですが、なんと、新しいポインタを上書き代入すれば古いポインタのほうは参照カウンタがちゃんとデクリメントされるんですね。つまり、ポインタを上書き代入したら古いヤツがどこからも参照されなくなるので、そのままdeleteされると。いや、これすげーよー。たとえば
void NewPowawa(){
Powawa *p1=<span class="cpp-keyword">new</span> Powawa("kawazoel");
p1=<span class="cpp-keyword">new</span> Powawa("acidlemon");
(... some instruction)
<span class="cpp-keyword">delete</span> p1; <span class="cpp-comment">// Powawa("acidlemon") のメモリを解放</span>
}
こういうコードを書くと、p1が持ってるポインタは"acidlemon"の方のPowawaオブジェクトであって、deleteするときも"acidlemon"のメモリが解放されますね。で、“kawazoel"のほうのメモリはどうやって解放するんだ? というと、p1に"acidlemon"のポインタを上書き代入してしまった時点で"kawazoel"のポインタは迷子になってしまったというわけです。もう一生解放できません。なので、まともなプログラマはこんなコードを書きません。つーかnewしたポインタを他のポインタで上書きとか、C++プログラマなら絶対こんなことできませんね。
で、これをスマートポインタで書くと
void NewPowawa(){
boost::shared_ptr<Powawa> p1(<span class="cpp-keyword">new</span> Powawa("kawazoel"));
<span class="cpp-comment">// p1に別のものを代入することによりPowawa("kawazoel")は使われなくなるのでdeleteされる</span>
p1=boost::shared_ptr<Powawa>(<span class="cpp-keyword">new</span> Powawa("acidlemon"));
(... some instruction)
} <span class="cpp-comment">// ここでローカル変数が破棄されるので、Powawa("acidlemon")も自動的にdeleteされる</span>
Powawaのポインタだったのをboost::shared_ptr<Powawa>にかえただけですが、p1へ"acidlemon"のPowawaオブジェクトのポインタを代入した時点で古い"kawazoel"のPowawaオブジェクトはどこからも参照されなくなり、そこでdeleteされちゃうというわけですね。つまり、ちゃんと"kawazoel"のオブジェクトのメモリも今度は解放されているぞ、と。
単に「うっかりのdelete忘れ」を防いでくれるだけのものだと思ってましたけど、スマートポインタって思った以上に賢いようです。ほんとすげーこれ、今まで使ってなかったのがすごく損した気分。
リアルとヴァーチャルの境目
ところで、エディタで行番号表示をするとき2種類方法があるっていうのは気付いてますか?
さすがに長い行がウィンドウからはみ出ると不便なのでウィンドウの右端とか、適当な文字数とかで折り返しますよね。そういう見やすさのための折り返しを含む行番号と、実際のファイルに含まれてる改行の個数にあわせた行番号の2つです。
で、それにあわせたクラス名を定義しようと思ったんですけど、さてなんてクラス名にしようかなー。とりあえず、ウィンドウの折り返しを含む行番号は論理行っていうよな、たぶん。だって、実際の改行ではなくてウィンドウの幅とかに即した論理的な数え方だからね。さてもう片方はなんていうんだろ、IRCで聞いてみよう。
00:26:49 <span class="irc-own">acidlemon</span>: あれー
00:26:58 <span class="irc-own">acidlemon</span>: 論理行の対義語(?)ってなんだっけ
00:27:08 <span class="irc-other">mitsuki</span>: 物理行?
00:27:08 <span class="irc-own">acidlemon</span>: 物理行…ではないし
00:27:12 <span class="irc-own">acidlemon</span>: それなのかー
00:27:27 <span class="irc-other">mitsuki</span>: 秀丸だとそうだけど
00:27:38 <span class="irc-own">acidlemon</span>: 一般的に物理行で通じるのかな
一般的なのかよく分からないので調べてみた。すると恐ろしい結果が…
エディタ | 改行のみ | 折り返し含む |
---|---|---|
秀丸エディタ | 物理行と、論理行 | |
EmEditor | 論理座標、論理行 | 表示座標 |
WZ EDITOR | 段落行 | 表示行 |
K2Editor | (特に名前無し) | レイアウト行番号 |
特に論理行っていう呼び方はEmEditorと秀丸エディタで真逆の意味になってたりします。オレ的感覚は秀丸エディタの呼び方に近いんだよなー。でもEmEditorユーザ。 なんかそうでもなさそうなので別記事で追記しました。そもそもこのIRCログを読む限りオレとmitsukiさんの間でも論理行と物理行の解釈が違ってたんじゃないか的な気もします。(2005/09/06)
まぁ別にこんなのはどうでもいいんですが、とりあえずクラス名を決めないと!
00:34:54 <span class="irc-own">acidlemon</span>: 用語を統一しろt
00:35:02 <span class="irc-other">mitsuki</span>: 適当でGo!
00:35:12 <span class="irc-own">acidlemon</span>: クラス名がきまらなーい
00:35:13 <span class="irc-other">mitsuki</span>: 考えるな、感じるんだ!(適当
00:35:36 <span class="irc-own">acidlemon</span>: RealLineとVirtualLineとかにしようか(適当
00:36:00 <span class="irc-own">acidlemon</span>: わりといい線いってるきがしてきt
結局リアルとヴァーチャルにおちつきました。こんな適当でいいのか?