2016-06-07 50 views
0

1)我們是否需要爲cli中的以下代碼進行指針驗證?有好感嗎?我們是否需要爲gcnew創建指針驗證

NameClass NameString^ = gcnew NameClass(); 

if (NameClass) 
{ 
    // some process 

2)如果我們在一個函數創建一個存儲和傳遞的指針等做我們需要驗證?

foo() 
{ 
    try { 
     NameClass *pNameString = new NameClass(); 
     foo_2(pNameString); 
     } catch(std::bad_alloc &error) 
     { 
      std::cout << error.what() << std::endl; 
     } 
} 

foo_2(NameClass *pNameString) 
{ 
    if (pNameString) // do we need to validate here ? 
    { 
    // some stuff 
    } 
} 

3)我們是否需要在引用傳遞中驗證本地創建的對象?

NameClass objNameClass; 
foo(&objNameClass); 

foo(NameClass *objNameClass) 
{ 
    if (objNameClass) // do we need to validate here ? 
    { 

回答

1

這只是後就像不必要一個gcnew,因爲它是一個new後。只有在出於某種原因使用諸如malloc之類的C分配器時纔有必要。 C++和C++/CLI構造使用異常來處理不成功的對象創建,與返回空指針的C函數不同。

在普通的C++中,如果內存不能分配,new會拋出std::bad_alloc。在這種情況下,在C++/CLI中,gcnew將拋出System::OutOfMemoryException

是大多數情況下,你應該讓異常傳播並殺死你的程序,因爲它可能是反正註定。


在你的第二個例子,你可能驗證指針foo_2只有當你希望別人打電話給foo_2空指針,而當這是一個有效的使用。如果使用無效的方法將空指針作爲參數傳遞給它,那麼你就有一個bug,應該讓你的應用程序崩潰(而不是讓它破壞你的數據)。如果foo_2只對分配後立即調用它的代碼可見,則不需要,因爲它不會爲空。

與第三個例子相同。你的函數的合同/文檔應指定其是否有效用空指針調用它,它的行爲方式。

而且,不要永遠寫:

catch(std::bad_alloc &error) 
{ 
    std::cout << error.what() << std::endl; 
} 

如果你有定期對象分配內存不足的情況,只是讓你的程序模具。試圖以這種方式治癒它並不會讓你走得很遠。

當這種代碼是可以接受的恕我直言,只有一個地方是,當你試圖動態分配一個潛在的大陣,你知道你可以取消操作,如果你不能這樣做。不要試圖捕獲每個分配的分配錯誤,這會使你的代碼膨脹並導致你無處可逃。

相關問題