2017-06-09 1 views
0

コード:voidポインタに変換すると値が破棄されますか?

class CFoo 
{ 
    int a; 
public: 
    CFoo():a(1){} 
    ~CFoo(){} 
    getNum(){return a;} 
}; 

void tfunc(void* data) 
{ 
    CFoo* foo = static_cast<CFoo*>(data); 
    std::cout << "Number: " << foo->getNum(); 
    delete foo; 
} 

int main() 
{ 
    CFoo* foo = new CFoo; 
    void* dt = static_cast<void*>(foo); 
    tfunc(dt); // or tfunc(static_cast<void*>(food)); 

    return 0; 
} 

ボイドポインタに変換し、はい、どのようにfoo->getNum()有効であることができれば、破棄するつもり値ではありませんか?

+5

何も破棄されません。あなたはそのアイデアをどこで手に入れましたか? – DeiDei

+1

破棄されるものはありません。あなたは単に 'CFoo'があるアドレスを指すようにコンパイラに指示します。 – NathanOliver

+0

まあ、ありがとう、私はそれが答えだと思います。私はcplusplusからアイデアを得ました。ここでは、「任意の型をvoidに変換し、値を評価して破棄します」と述べました。 [static_castでもできること](http://www.cplusplus.com/doc/tutorial/typecasting/#static_cast) –

答えて

0

voidポインターに変換するとき、値を破棄しません。あなたの文で変換され

値がポインタではなく、オブジェクトへのポインタがあります。

void* dt = static_cast<void*>(foo); 

変数fooの値は、いくつかCFooオブジェクトのアドレスです。この文は同じ値(つまり、foodtの両方が同じアドレスを指している)を持つ新しい変数dtを定義しますが、コンパイラは*dtを逆参照させません--- voidオブジェクトをフェッチすることはできませんそのアドレスからはvoidタイプに値がないためです。あなたのプログラムがtfuncを呼び出すと

は、仮引数dataも同じ値(すなわち、それは同じアドレスを指す)のコピーを取得し、最終的にはそうtfunc内のローカル変数fooを行います。

tfunc内のローカルfooの宣言された型は、CFooへのポインタです。そのため、コンパイラでは逆参照できます。 fooが実際に正当なCFooオブジェクトを指していることを知っているので、意味があります。

関連する問題