2017-11-10 59 views
-2

短而有效下面的例子:如何將唯一指針傳遞給函數中所需的特定參數?

std::unique_ptr<float> x(new float[whatever_size]); 

我有一個函數原型有:

void function(float*&); 

我該如何去通過傳遞在x調用它。 我想:

function(x.get()); // complains no argument matches float*& 
function(&x.get()); // complains requires lvalue. 

與解釋一個簡單的回答將是巨大的。 謝謝!

+4

你應該爲數組使用'std :: unique_ptr '(或者更好地使用一個向量)。 – Galik

+2

與您的直接問題無關,但您的'x'應該聲明爲'std :: unique_ptr ' - 否則您的代碼將顯示未定義的行爲,因爲數組被刪除而不是delete []'。 –

+1

爲什麼函數需要一個'float *&'而不是'float *'?它是否真的修改了它的論點,如果是的話,它會做什麼? –

回答

4

首先,你應該知道一個獨特的指針不會奇蹟般地保護你免於搞亂內存管理。你的用例非常可怕,我會告誡你不要假設一個獨特的指針可以解決任何事情。


function需要一個可修改的左值引用。呼叫x.get()返回一個右值。當然,參考不會束縛它,無論你多努力。現在,明顯的解決方案是引入一個臨時的:

auto *f = x.get(); 
function(f); 

但這可能回來,拍你的腳,如果function需要實際修改f,指針,而不是指針對象。


既然你提到它的評論,它確實修改了它的論點。您必須reliniquish從唯一指針所有權的呼叫之前,並給它回來後:

auto *f = x.release(); 
function(f); 
x.reset(f); 

這就是變化將在x反映的唯一途徑。但是,它仍然有點脆弱。

+0

「釋放」和「重置」序列可能會或可能無法正常工作,具體取決於函數的作用。例如,如果'function'不釋放'f',你可能想跳過'release'步驟。 –

+0

@DanielH如果函數不修改傳入的指針,那麼爲什麼它通過非const引用來接收它? – Galik

+0

@DanielH - 如果'function'文明,釋放沒有任何危害。如果它接受它應該爲調用擁有的原始指針,並且拋出時不釋放,則它是邪惡的,不應該被使用。 – StoryTeller

2

這裏的問題是,該函數可以修改您傳遞給它的指針(由非const引用傳遞),可能會重新設置它。如果是這樣的話,那麼你就必須做這樣的事情:

std::unique_ptr<float[]> x(new float[N]); // remember the array type [] 

float* fp = x.release(); 
func(fp); 
x.reset(fp); 

但關鍵的一點是傳遞一個正確的(命名)的指針,而不是僅僅通過x.get()返回一個臨時的指針。

發生錯誤是因爲函數無法修改函數x.get()返回的臨時指針。你必須給它一個真實指針,可以改變價值。