2014-11-25 179 views
0

我已經在使用Objective-C++的iOS項目中調整了Matt Gallagher的"Testing if an arbitrary pointer is a valid object pointer"。它與Objective-C對象一起工作良好,但它始終告訴我,無論C++指針是否工作,我的C++指針都是無效的。有時代碼會在指針處崩潰。有時代碼工作正常。但是測試方法總是告訴我指針是錯誤的。檢查C++指針是否有效(在Objective-C(++)中)

在這裏任何人都知道將此代碼調整爲C++類和對象嗎?我可以想象,根據「類」的使用,代碼只與Objective-C一起工作。

+0

當您檢查指針是否有效時,您是否嘗試過使用'nullptr'?如果你想檢查有效數據,那麼你需要取消引用指針,如果指針本身無效,這將導致exc_bad_access(segfault)。截至目前,我不認爲有任何方法可以實際檢查數據。 – 2014-11-25 12:31:51

+1

該方法對Apple的Objective-C實現非常具體,最多也不可靠。對於C++來說,沒有辦法做類似的事情,正如作者指出的那樣,「不要在生產代碼中使用它」。 – molbdnilo 2014-11-25 12:33:31

+0

@AlexanderW是的,我們正在檢查nullptr,null,nil,0 ...但是代碼有時總是繼續執行,然後崩潰,然後用EXC_BAD_ACCESS找不到... => molbdnilo我們僅使用它來編寫調試日誌以獲取有關我們內部測試人員工作流程的詳細信息。他們通常不會正確地報告崩潰... – 2014-11-25 12:36:00

回答

1

指針變量的內容是:空指針,指向對象的有效指針,指向數組元素的有效指針或者超過數組的最後一個元素,或者某個無效指針。

如果它是一個無效的指針,然後任何試圖使用它調用未定義的行爲。這包括任何試圖檢查它是一個無效的指針。那裏你卡住了。你所能做的只是檢查它是否是空指針,或者它是否等於其他有效指針。

你應該使用Objective-C哲學:試圖使用無效指針是一個編程錯誤。您不會嘗試在運行時檢測並處理此問題。你讓它崩潰並修復你的代碼中的錯誤。

1

C++指針只是引用內存中的地址。您可以使用內存查看器工具查看內存中的內容,但這甚至不能保證內存仍然有效。例如:

char* test = new[13]; 

strcpy(test, "Hello World!"); 
delete[] test; 
. 
. 
. 
printf("%s", test); 

在某些情況下,這將成功打印。有時它會打印一個垃圾字符串。有時候會出現段錯誤。沒有什麼可以說明指針的有效性的。

如果您正在尋找在剛剛segfaulted程序和你想看看發生了什麼有給你提供幾個選擇:

  • 你可以看一下通過內存觀衆,結合你錯誤的線路可以提供見解。
  • 你可以在跑步之前播種你的記憶,使之更清晰地使用0xbadfood5或類似的東西。
  • 使用Valgrind運行時是一個很好的工具,如果你可以處理開銷。

最好的選擇是在你的代碼中進行錯誤檢查。這聽起來像你沒有,或者你不會在這裏。先決條件和後置條件非常好,從長遠來看可以爲您節省大量時間(就像現在一樣)。然而,作爲一線希望,您應該利用這一點來確保組織中未來的編碼標準更好。