2017-10-05 125 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; 
} 

我試過了通過引用傳遞指針的建議,仍然沒有運氣。

我很困惑,爲什麼指針被傳入的方式,即使真的很重要,因爲我只使用該指針來獲取地址作爲基地,然後我去創建一個新的指針,使用reinterpret強制轉換那(地址+ 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

這不是我的抵消計算,因爲我在那裏檢查以確認它不是祕密對象中的垃圾數據。修改得很好。它在函數返回後不會被保留。另外我很困惑,爲什麼pObj不會給出指針的地址而不是poitner指向的對象的地址? – mocode10

+0

爲了公平起見,我改變了我的代碼以刪除冗餘,它的工作原理相同,只是尋找解釋爲什麼它的工作原理相同:) – mocode10

+0

沒有您的代碼的更多細節,我只能建議您在代碼中運行代碼一個調試器並查看內存內容。您的代碼會更新內存位置,以便在函數結束後更改它。因此,猜測你正在改變錯誤的內存位置似乎是合理的。 –