トップページ⇒tech
18コメント5KB

どうして!?

■ このスレッドは過去ログ倉庫に格納されています
0001教えて君NGNG
#include <stdio.h>

class Hoge
{
public:
  void func()
  {
    printf("ゴルァ\n");
  }
};

int main(void)
{
  Hoge* h = 0;
  h->func();

  return 0;
}

--- 実行結果 ---
ゴルア
0002教えて君NGNG
実行結果 : ゴルア → ゴルァ の間違い。(藁
0003デフォルトの名無しさんNGNG
ただのバグじゃないのか?
つーか、コンパイラ名ぐらい書け。
0004デフォルトの名無しさんだもんNGNG
ポインタだけで実態(インスタンスって言うんだっけ)がないからじゃないの?
0005デフォルトの名無しさんNGNG
クラス内のメソッドにアクセスしてないから
上手くいっているように見えるだけだろ?
0006Java使いNGNG
これだからC++は気持ち悪い。
NullPointerExceptionも出んのか。
0007デフォルトの名無しさんNGNG
Hoge::funcをvirtualにしたらクラッシュした。(当たり前だけど。)
でもnon-virtualだとクラッシュしない。

これって仕様なの!?

>>3
スマソ。VC++ 6.0です。
0008教えて君NGNG
7=1です。
0009デフォルトの名無しさんNGNG
仕様だろ?Virtualでなければ、コンパイル時にメンバ関数は解決
できるから、thisポインタに0がpushされてコールされるだけ。
けっきょくだれもthisポインタ触らないから動く。
0010>6NGNG
C#でやってみたら、non-virtualはクラッシュせず。
VB.NETでやってみたら、NullReferenceException発生。

よって、C#はC++とお友達。VB.NETはJavaとお友達。
0011デフォルトの名無しさんNGNG
h->func(); はvirtualじゃないから、
Hoge::func()にアーリーバインディングされる。
処理は、ヌルのthisポインタを抱えながらHoge::func()関数内に移行する。
関数内でもデータメンバにアクセスしているわけでもないので、
なんのアサーションも出ないで関数からご帰還。

メモリ上のクラスオブジェクトを参照しないで、
メンバ関数を含むコードブロックだけを参照しているから
エラーがでないのかな?

VC6.0++以外のコンパイラではどうなんでしょ?
0012教えて君NGNG
>>9 >>11
何となくですが理解できました。ありがとうございます。

ただ、1つだけよくわからないのは、newしてないのに
Hoge::funcの実体があることです。

これって、staticメソッドみたいに実体は1つで
クラスで共有されてるということなのでしょうか。

今までずっと、インスタンスごとに1つづつ作られるものだと思ってましたが...。
0013デフォルトの名無しさんNGNG

       / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
Λ_Λ  | 君さぁ こんなスレッド立てるから          |
( ´∀`)< 厨房って言われちゃうんだよ              |
( ΛΛ つ >―――――――――――――――――――‐<
 ( ゚Д゚) < おまえのことを必要としてる奴なんて         |
 /つつ  | いないんだからさっさと回線切って首吊れ     |
       \____________________/
0014デフォルトの名無しさんNGNG
(・∀・) ジサクジエンデシタ
0015デフォルトの名無しさんNGNG
>>12
http://objc.sourceforge.org/とかが生成する
コードを見てみるとわかると思うけど、、、


typedef struct
{
} Hoge;

void Hoge_func( Hoge *this )
{
printf( "ゴルァ\n" );
}

int main( void )
{
Hoge *h = 0;

Hoge_func( h );
}

こんなふうになってると思えばいいかも。

001615NGNG
http://objc.sourceforge.net/ でした。
0017デフォルトの名無しさんNGNG
>>12
>ただ、1つだけよくわからないのは、newしてないのに
>Hoge::funcの実体があることです。
理解してねーじゃねーか

9,11はしっかり書いてくれた、ここら辺理解できたら
こんな板でも、立った意味があったのに・・・
0018デフォルトの名無しさんNGNG
*************** 終了 ***************
■ このスレッドは過去ログ倉庫に格納されています