2012-04-26 8 views
3

クラス内のメンバとして使用されている構造体へのポインタを使って混乱を取り除こうとしています。私は次のコードを書いたが、プログラムがコンパイルされてもクラッシュする。次のコードで私が間違っていることを教えてください。c/C++の構造体へのポインタとの混同

#include<stdio.h> 
#include<string.h> 

struct a{ 
    int s; 
    int b; 
    char*h; 
}; 

class test 
{ 
public: 
    a * f; 
    void dh(); 
    void dt(); 
}; 

void test::dh() 
{ 
    a d; 
    d.s=1; 
    d.b=2; 
    d.h="ffdf"; 
    f=&d; 
} 

void test::dt() 
{ 
    printf("%s %d %d",f->h,f->b,f->s); 
} 

int main() 
{ 
    test g; 
    g.dh(); 
    g.dt(); 
    return 0; 
} 
+1

googleのルール3.スマートポインタを代わりに使用します。 –

答えて

8
void test::dh() 
{ 
    a d; <-- 
    d.s=1; 
    d.b=2; 
    d.h="ffdf"; 
    f=&d; <-- 
} 

あなたは、ローカルオブジェクト、dを作成し、このオブジェクトのアドレスへfを設定しています。関数が終了すると、オブジェクトはスコープの外に出て、ぶら下がったポインタが残されます。

4

あなたの最大の問題は、dh()が戻るまでに、dはスコープ内に存在しなくなりました。 a d;の代わりにdh()f = new a(); f.s=1; f.b=2, f.h="ffdf";が必要です。

+0

宣言のためメモリの問題が発生する可能性があります f = new a()? –

+2

@the_naive対応する 'delete'を持っている限り、あなたは良いです。あなたがそれを心配している場合、またはそうでない場合でも、スマートポインタの使用を検討してください。彼らはあなたのために記憶を解放するでしょう。 – chris

+2

@the_naive、技術的にはい。正しいとするために、コードは 'f'の割り振りが失敗する可能性があると期待しています。実際には、この小さなデータ構造の小さなプログラムでは、これは起こりません。おそらく常にチェックする習慣があるはずですが、回復する明確な方法がない場合は、時にはクラッシュさせてやり直すのが一番です。 – sblom

2

test :: dhでは、ローカル変数であるdのアドレスをパブリックポインタfに割り当てます。 g.dh();が終了すると、dのアドレスはもはや有効ではないため、g.dt();のfへの参照は失敗します。

関連する問題