2005/09/05

スマートポインタはすごいな

さすがプログラム書いてる時はネタに欠かさないぜ!

とりあえずboost::shared_ptrがすごいです。クラスのメンバで古いポインタを保持してるところに新しいポインタを上書き代入すると、古いポインタは一体どうなるんだろうっていうかこれdeleteできないとやばいよって思ってたんですが、なんと、新しいポインタを上書き代入すれば古いポインタのほうは参照カウンタがちゃんとデクリメントされるんですね。つまり、ポインタを上書き代入したら古いヤツがどこからも参照されなくなるので、そのままdeleteされると。いや、これすげーよー。たとえば

void NewPowawa(){
    Powawa *p1=new Powawa("kawazoel");
    p1=new Powawa("acidlemon");
    (... some instruction)
    delete p1; // Powawa("acidlemon") のメモリを解放
}

こういうコードを書くと、p1が持ってるポインタは"acidlemon"の方のPowawaオブジェクトであって、deleteするときも"acidlemon"のメモリが解放されますね。で、"kawazoel"のほうのメモリはどうやって解放するんだ? というと、p1に"acidlemon"のポインタを上書き代入してしまった時点で"kawazoel"のポインタは迷子になってしまったというわけです。もう一生解放できません。なので、まともなプログラマはこんなコードを書きません。つーかnewしたポインタを他のポインタで上書きとか、C++プログラマなら絶対こんなことできませんね。

で、これをスマートポインタで書くと

void NewPowawa(){
    boost::shared_ptr<Powawa> p1(new Powawa("kawazoel"));
    // p1に別のものを代入することによりPowawa("kawazoel")は使われなくなるのでdeleteされる
    p1=boost::shared_ptr<Powawa>(new Powawa("acidlemon")); 
    (... some instruction)
} // ここでローカル変数が破棄されるので、Powawa("acidlemon")も自動的にdeleteされる

Powawaのポインタだったのをboost::shared_ptr<Powawa>にかえただけですが、p1へ"acidlemon"のPowawaオブジェクトのポインタを代入した時点で古い"kawazoel"のPowawaオブジェクトはどこからも参照されなくなり、そこでdeleteされちゃうというわけですね。つまり、ちゃんと"kawazoel"のオブジェクトのメモリも今度は解放されているぞ、と。

単に「うっかりのdelete忘れ」を防いでくれるだけのものだと思ってましたけど、スマートポインタって思った以上に賢いようです。ほんとすげーこれ、今まで使ってなかったのがすごく損した気分。

リアルとヴァーチャルの境目

ところで、エディタで行番号表示をするとき2種類方法があるっていうのは気付いてますか?

さすがに長い行がウィンドウからはみ出ると不便なのでウィンドウの右端とか、適当な文字数とかで折り返しますよね。そういう見やすさのための折り返しを含む行番号と、実際のファイルに含まれてる改行の個数にあわせた行番号の2つです。

で、それにあわせたクラス名を定義しようと思ったんですけど、さてなんてクラス名にしようかなー。とりあえず、ウィンドウの折り返しを含む行番号は論理行っていうよな、たぶん。だって、実際の改行ではなくてウィンドウの幅とかに即した論理的な数え方だからね。さてもう片方はなんていうんだろ、IRCで聞いてみよう。

00:26:49 acidlemon: あれー
00:26:58 acidlemon: 論理行の対義語(?)ってなんだっけ
00:27:08 mitsuki: 物理行?
00:27:08 acidlemon: 物理行…ではないし
00:27:12 acidlemon: それなのかー
00:27:27 mitsuki: 秀丸だとそうだけど
00:27:38 acidlemon: 一般的に物理行で通じるのかな

一般的なのかよく分からないので調べてみた。すると恐ろしい結果が…

エディタ改行のみ折り返し含む
秀丸エディタ物理行と、論理行論理行表示行
EmEditor論理座標、論理行表示座標
WZ EDITOR段落行表示行
K2Editor(特に名前無し)レイアウト行番号

おいっ、ばらばらじゃねーかっ。

特に論理行っていう呼び方はEmEditorと秀丸エディタで真逆の意味になってたりします。オレ的感覚は秀丸エディタの呼び方に近いんだよなー。でもEmEditorユーザ。 なんかそうでもなさそうなので別記事で追記しました。そもそもこのIRCログを読む限りオレとmitsukiさんの間でも論理行と物理行の解釈が違ってたんじゃないか的な気もします。(2005/09/06)

まぁ別にこんなのはどうでもいいんですが、とりあえずクラス名を決めないと!

00:34:54 acidlemon: 用語を統一しろt
00:35:02 mitsuki: 適当でGo!
00:35:12 acidlemon: クラス名がきまらなーい
00:35:13 mitsuki: 考えるな、感じるんだ!(適当
00:35:36 acidlemon: RealLineとVirtualLineとかにしようか(適当
00:36:00 acidlemon: わりといい線いってるきがしてきt

結局リアルとヴァーチャルにおちつきました。こんな適当でいいのか?

うされもん @acidlemonについて

|'-')/ acidlemonです。鎌倉市在住で、鎌倉で働く普通のITエンジニアです。

30年弱住んだ北海道を離れ、鎌倉でまったりぽわぽわしています。

外部サイト情報

  • twitter
  • github
  • facebook
  • instagram
  • work on kayac