有時你可以使用...
u8* p = arg ? arg : new u8(...);
...do things with *p...
if (!arg) delete p;
小票友,您可以編寫與運行時配置的所有權的智能指針:
template <typename T>
class Uncertain_Ownership_Ptr
{
public:
enum Ownership { Own_It, Dont_Own_It };
Uncertain_Ownership_Ptr(T* p, Ownership own) : p_(p), own_(own) { }
Uncertain_Ownership_Ptr(const Uncertain_Ownership_Ptr&) = delete;
void operator=(const Uncertain_Ownership_Ptr&) = delete;
~Uncertain_Ownership_Ptr() { if (own_ == Own_It) delete p_; }
T& operator*() { return *p_; }
const T& operator*() const { return *p_; }
T* operator->() { return p_; }
const T* operator->() const { return p_; }
private:
T* p_;
Ownership own_;
};
...然後...
void Func_A(u8* arg)
{
Uncertain_Ownership_Ptr p(arg ? arg : new u8(...),
arg ? Uncertain_Ownership_Ptr::Dont_Own_It : Uncertain_Ownership_Ptr::Own_It);
// use *p ...
}
如果你能描述'* arg'是輸入還是輸出,以及'arg'爲NULL時'Func_A'意味着什麼,這將有所幫助。 – 2014-10-29 06:12:06
您可以嘗試函數的默認參數,但我不太確定這種情況對您的情況會有多大改變。 – Niall 2014-10-29 06:33:45
'local_arg'在你的代碼中沒有做任何事情。你應該發佈一個更現實的例子。 – juanchopanza 2014-10-29 06:37:37