2017-10-05 20 views
2

セットアップにはオブジェクトがあり、そのオブジェクトの下には秘密のポインタがあります。C++オブジェクトポインタの値が保存されていません。

このポインタは、同じクラスのオブジェクトを指しますが、それ以外のオブジェクトを指します。

私はトップオブジェクトを取り込み、その下にあるポインタを得るためにポインタ演算を使用する関数を持っています。

この関数の中で、秘密ポインタが指しているオブジェクトの値を変更したいと思います。

デバッグでは、値が関数内で正常に変更されていることがわかりますが、関数が戻っても値は保持されません。

私はなぜ混乱していますか。

アイデア?

また、これらのオブジェクトとポインタが作成されているすべてのメモリを所有していますので、自分の小さなメモリマネージャを楽しいものとしてやっているため、ヒープの問題は起こらないと思います。

私は "reinterpret_castを使用して問題が私と関連していると思っていますが、もし私が解決策/代替品となるものがあれば、それはなぜ問題でしょうか?

void doWork(Obj* pObj) { 
    // Get address of the object the pointer is pointing to 
    unsigned char* position = reinterpret_cast<unsigned char*>(pObj); 

    // 16 Bytes below the object is a secret pointer  
    position += (sizeof(Obj) + 16); 

    // Retrieve the secret pointer 
    Obj* secretObj = reinterpret_cast<Obj*>(position); 

    // Modify a value in that secret object 
    secretObj->value += 1; 
} 

私は、ポインタを参照渡しの提案を試みたが、まだ運がなかった。

私はポインタが渡される方法が混乱しているのですが、そのポインタをベースとして使用するためにそのポインタを使用していて、再ポインタを使用して新しいポインタを作成すると正直なところです。その(アドレス+ sizeof(Obj))、その新しく作成されたポインタに対する私の作業を行います。

+0

「reinterpret_cast」を使用しているときはいつでも、 – Ron

+0

&(* pObj)と同じことを達成するのは正しいことです – mocode10

+0

なぜ私は混乱していますか?オブジェクトのアドレスではなくポインタのアドレスをポインタとすることはできませんに指差す? – mocode10

答えて

0

ポインタをポインタに渡しているからです。 アドレスのアドレス。変更は機能の範囲内でのみローカルに保持されます。 これを解決するには、参照付きでポインタを渡す必要があります。

無効doWork(OBJの* & POBJ)

これは動作するはずです。

+0

私はあなたが言っていることを漠然としています。しかし、構文を使ってこれを修正する簡単な例を教えてください。 – mocode10

+0

@ mocode10 https://stackoverflow.com/questions/10240161/reason-to-pass-a-pointer-by-reference-in-c このリンクをチェックしてください –

+0

"あなたがポインタが指しているオブジェクトではなく、ポインタを変更する必要があります。 – mocode10

0

(&(*pObj))は冗長です。逆参照したばかりのオブジェクトのアドレスを取得しています。確かに(&(*pObj)) == pObj

最も大きな問題はオフセット計算です。あなたの計算では、Objと16のサイズが追加されます。Objの詳細、または秘密のポインタがどのように定義されているかわからないため、これが正しいかどうかは分かりません。valueあなたの関数で動作しているように見えますが、間違ったバイトを変更して関数の外で正しく見えないようにしました。

+0

秘密のオブジェクトのガベージデータではないことを確認するためのチェックがあるので、私のオフセット計算ではありません。修正はうまくいく。関数が返った後も保持されません。また、私はpoObnerが指し示すオブジェクトのアドレスではなく、ポインタのアドレスをpObjが与えない理由について混乱していますか? – mocode10

+0

公平であるために、私は冗長性を取り除くためにコードを変更しました。同じことをしていますが、なぜ同じ働きをするのか説明しています:) – mocode10

+0

コードの詳細がなければ、デバッガを起動し、メモリの内容を確認します。あなたのコードは関数の終了後に変更されるようにメモリの場所を更新します。したがって、誤ったメモリ位置を変更していると推測するのは合理的です。 –

関連する問題