2009-10-04 133 views
1

將指針寫入字符串,刪除指針並從字符串加載指針?是否有可能?(C++)

+2

爲什麼不可能? – Zed 2009-10-04 13:33:46

+3

你應該多解釋一下你的問題。例如,「刪除指針」是什麼意思? – sellibitze 2009-10-04 13:38:31

回答

14

可以執行這些操作,但它們不會影響您(可能)之後的效果。

將指針寫入字符串將只存儲指針值,即指向對象的地址。這是一個或多或少長度不變的字符串,如0x7f2b93c91780(在64位系統上)。當然,這不會捕獲任何實際對象的狀態。

當您在指針上使用delete時,指向的內存將返回到系統;它不再是你的使用。指針本身沒有被刪除,操作隻影響被指向的內存。另外,當您使用delete時,指針的值實際上並不會改變。因此,如果您現在通過從存儲在其他地方的字符串中讀取它來重新加載它,則沒有區別:它仍指向您不再擁有的內存,因此無需讀取或寫入,即可調用undefined behavior

像PiotrLegnica建議的那樣,您需要將整個對象序列化爲一個字符串,然後從序列化版本重新創建對象(反序列化它)。

+0

實際上,當你說'delete ptr'時,你不會刪除指針,而是指向它的值。指針對象本身只在超出作用域時才被刪除。所以「刪除指針」(通常)不是一個正確的術語。除此之外,我完全同意你的答案。 +1 – sbi 2009-10-04 14:20:25

+0

@sbi:我猜我被共通性蒙上了一層陰影,我真的認爲並且說「刪除指針」,雖然我當然知道指針本身並不是被刪除的......我試着更加精確。 – unwind 2009-10-04 14:31:31

+0

@unwind:這只是一個小點。 (雖然我認爲精確往往是有幫助的,尤其是在回答那些顯然有問題的新手問題時......) – sbi 2009-10-04 23:03:18

7

這是可能的,但它不會做你認爲它會做的事。將整個對象保存爲字符串稱爲序列化 - 如果需要,請參閱Boost.Serialization(或Protocol Buffers,如註釋中所述)。

+1

如果可能,建議使用Google協議緩衝區:http://code.google.com/intl/fr/apis/protocolbuffers/docs/overview.html,最好將對象本身的序列化/反序列化結構與前向/後向解相關兼容性。 – 2009-10-04 13:49:00