2010-07-02 25 views
11

我在最近的一次採訪中被問到了這個問題,基本上寫了一個函數來結合free和assign null的功能。我回答以下方式:寫一個函數來釋放一個指針並賦值它NULL

void main() 
{ 
     int *ptr; 
     ptr = new int; 
     ptr = newdelete(ptr); 
} 

(int*) newdelete (int *ptr) 
{ 
     delete(ptr); 
     return NULL; 
} 

執行後因此,ptr本地main將持有空值,因爲我從newdelete函數返回它。如果我剛剛在newdelete函數中分配了NULL,本地ptr將被清零,而本地main將被清空。

我想我的解決方案是正確的,面試官也接受了。但是,他期待着一些其他的答案。他堅持我不會從功能中返回NULL,並且仍然達到預期的效果。

有什麼辦法可以做到這一點?我所能想到的只是傳遞另一個參數,指向指向main的指針ptr,但我不明白爲什麼它比我所做的更好!

+0

我想你的意思是'new int',因爲'New'不是一個定義的'C++'操作符。 – ereOn 2010-07-02 07:09:36

+1

傳遞對指針的引用。 – 2010-07-02 07:10:36

+0

http://stackoverflow.com/questions/1265666/reason-why-not-to-have-a-delete-macro-for-c/1265681#1265681 – Goz 2010-07-02 07:31:09

回答

36

有沒有辦法做到這一點?

template <typename T> void safeDelete(T*& p){ 
    delete p; 
    p = 0; 
} 

int main(int argc, char** arv){ 
    int * i = new int; 
    safeDelete(i); 
    return 0; 
} 
+0

+1,最直接,最靈活的解決方案。 – stinky472 2010-07-02 07:16:04

+4

由於只有代碼,所以這是一個更好的解決方案的原因是,您保證在調用期間指針將被清零。用問題中的代碼,你可以跳過(忘記)返回值:'/ * p = */newdelete(p);'並且內存將被釋放,但指針將是非空的。 – 2010-07-02 07:22:16

+6

請記住,您需要第二個版本的陣列。 – 2010-07-02 07:55:12

8

我猜他期待這樣的:

void reset(int*& ptr) 
{ 
     delete(ptr); 
     ptr = NULL; 
} 

一個更清潔的解決辦法是使用boost::shared_ptr<>,並簡單地調用ptr.reset()。不過,我想這不是一個選擇。

+1

如果他們不想共享指針語義呢?如果你不需要額外的開銷,沒有意義。 – 2010-07-02 07:30:01

+1

@Peter scoped_ptr在這種情況下同樣提供重置。 – stinky472 2010-07-02 07:36:31

+0

@Peter:我應該提到'scoped_ptr'而不是'shared_ptr'(我更經常地使用後者,所以它首先出現在我的腦海裏)。無論是共享的還是作用域的,使用智能指針都比任何結合原始指針的'safeDelete()'函數更安全。 – ereOn 2010-07-02 08:10:02

1

如果requrement不是寫一個函數,你總是可以編寫一個宏,將做到這一點對你來說也是:

#define my_delete(x) { delete x; x = NULL; } 

當然,調用它像這樣讓您進入各種的麻煩:

my_delete(ptr++) 

所以,我認爲我更喜歡非宏觀方式。

1

你不

您可以使用智能指針像auto_ptrshared_ptr是空值本身。

相關問題