DEZZ.net

2008/4/10 木曜日

VC++2005のauto_ptrがおかしい

カテゴリー: C++ — nano @ 0:54:10

タイトルの通り。
何か変。

std::auto_ptr<test> t;

t = new Test();

↑これを実行すると、アクセス違反になる。

t.reset(new Test());

にすればOK。

operator =がおかしいっぽいんだけど。
見てみると、なぜかauto_ptr_refを引数に取るようにしてる。
で、そこからポインタのポインタを辿って…


auto_ptr<_Ty>&
operator=(auto_ptr_ref<_Ty> _Right) _THROW0()
{    // assign compatible _Right._Ref
(assume pointer)
    _Ty **_Pptr = (_Ty **)_Right._Ref;
    _Ty *_Ptr = *_Pptr;
    *_Pptr = 0;  
 // release old
    reset(_Ptr);  
 // set new
    return (*this);
}

*_Pptr = 0; // release old

↑これって一体どこが0になるんだろ。
Refの指してる場所って、呼び出し側のスタック領域じゃ?

なんかわけわからんので、auto_ptrはやめてboost::scoped_ptrにしようかと思いました。
STLってだいぶ陳腐化してるなぁ…。

追記:
http://d.hatena.ne.jp/xanthus/20080205/p2
↑ここで詳しく解説されてました。
やっぱ、0入れてるとこで領域ぶっ壊してるよねw

で、boost::scoped_ptrはnewされたポインタを扱うoperator =がありませんでした。
はいはいワロスワロス。

まあ普通にresetでいいかー。
所有権とかワケワカメな要素が無いので、auto_ptrよりはscoped_ptrのほうが効率が良いっぽい。

あぁー。俺は普通に代入がしたいんだ!
自由なタイミングでnewしたいじゃん。

2008/4/7 月曜日

仮想関数でリンカエラー

カテゴリー: C++ — nano @ 2:44:30

エラー 1 error LNK2005: _printf は既に LIBCMTD.lib(printf.obj) で定義されています。 MSVCRTD.lib

↑みたいなエラーが出て困ってる人ー!

もうね。やっぱC++はABIがしっかりしてないからダメかもしれないと思いました。
1時間半悩んだ結果、次の結論に…。

VC++2005では
1.スタティックリンクライブラリを使うときに
2.ライブラリプロジェクトと、使用する側のプロジェクトで、CRT(C Runtime Library)の設定(DLL or スタティックリンク)が異なり
3.ライブラリ側にある仮想関数を持ったクラスを使うと
リンカエラーが出ます(‘A`;)

つまり、、


↑これと


↑これを組み合わせると


↑こうなっちゃうわけですね。

うーん。これに気づくまで2時間ぐらいかかった。
ちょおおお大変だったよ!

っつうかこれってリンクの仕様としては正しいの?
バグ?

# 追記:
更に、うちの環境ではCPPUnitをスタティックリンクで使用していた関係で、余計ややこしくなってました…。
CPPUnitのライブラリをビルドしたときのCRTの設定も影響してくる。おそろしー

2008/4/4 金曜日

Wordpressアップグレード

カテゴリー: 日記 — nano @ 0:05:43

今日はWordpressを2.5にアップグレードしてみた。
何かデザインが変わってる…!!

しかしだ。

相変わらずビジュアルエディタはダメ。

gzipの圧縮がダメっぽいんだけど、どこを直したら良いのやら…。
というか、めんどくさいのでHTML直打ちでOKw

HHKは、Altキーはよく使う割りに外に追いやられてる気がしたので、DIPスイッチ4をONにして、メタキーと入れ替えてみました。
Alt + Dが入力しやすくなって満足です。

この前、仕事中に普通のキーボードも使ってみましたが、カーソルキーが遠すぎてダメです。
もうこの配列になれてしまいました…

Powered by WordPress