2016-12-14 62 views
3

如果沒有第二個參數提供,我有一個默認實例化指針的函數。是在C++默認指針參數上調用的刪除

void doSomething(int a, Obj* obj = new Obj()) { 
... 
} 

我需要調用的函數裏面明確的刪除,如果我想釋放OBJ或者是做自動如果我實例化從默認值PARAM指針?

我想避免做一個明確的刪除自己,因爲如果通過第二個參數,那麼我不想刪除調用者傳遞的指針。

+3

'delete'從未被稱爲語言。考慮一個基於智能指針的參數引用計數(否則你永遠不會確定該對象是否構造爲默認參數) – Donnie

+2

*「我想避免做一個明確的刪除我自己,因爲如果通過第二個參數,那麼我不'你想刪除調用者傳遞的指針。「*對。這就是爲什麼你不能使用這種模式。 –

+0

這看起來像是一個簡單地擁有一個'doSomething(int a)'重載的機會,它使用它管理的obj指針調用'doSomething(int a,Obj * obj)'。或者更好,一個聰明的指針。還要考慮:如果某人在目前明確地將一個空指針傳遞給你的函數,會發生什麼?看起來你可能會試圖保證'obj'永遠不會爲空,但這是一個不好的方法... – jaggedSpire

回答

6

這聽起來像你的內存所有權語義需要返工。在某些情況下,你擁有自己的記憶和其他你沒有的記憶。如果你堅持默認創建一個Obj的實例,那麼也接受一個布爾值來指示你是否擁有內存。但最後,我實際上建議你使用重載來完成這個任務,其中一個函數需要一個參數,而另外兩個參數需要。只接受一個將創建一個Obj的實例,然後調用您的基地doSomething函數。

喜歡的東西:

void doSomething(int a, Obj* obj) { 
... 
} 

void doSomething(int a) { 
    Obj tmp; 
    doSomething(a, &tmp); 
}