2012-11-15 68 views
4

當函數需要char *時,您可以傳入一個shared_ptr嗎?shared_ptr原始指針參數

我正在閱讀整個文本文件(長度= 100),並希望將char存儲到char []數組中。我曾經用簡單的方式是這樣的:

ifstream dictFile(fileName); 
size_t fileLength = 100; 
char* readInBuffer(new char[fileLength]); 
dictFile.read(readInBuffer, fileLength); 
//processing readInBuffuer.............. 
delete[] readInBuffer; 
dictFile.close(); 

當然有,如果有異常的刪除[]語句之前拋出內存泄漏。我想知道是否可以使用 shared_ptr readInBuffer(new char [fileLength]); 但函數原型

讀取(字符* S,streamsize可N)

不會接受一個智能指針作爲輸入?任何技巧?

編輯:我想寫的東西是這樣的:

shared_ptr<char[]> readInBuffer(new char[fileLength]); 
dictFile.read(readInBuffer.get(), fileLength); 

但它不會編譯。

+0

可能重複[從共享\ _ptr獲取正常ptr?](http://stackoverflow.com/questions/505143/getting-a-normal-ptr-from-shared-ptr) –

+1

您已擁有部分在你的問題中的答案 - 一個普通的指針沒有'get()'方法,但是一個智能指針可以做到,它完全符合你的要求。 –

+0

'shared_ptr'不夠智能來管理數組。不過,'unique_ptr'是,如果你給它一個定製的刪除器。 –

回答

2

大發警告:創建shared_ptr指向數組引發未定義的行爲,因爲智能指針會delete指針,不delete[]它。改爲使用vector

將此留在此處是因爲它可能會作爲有用的警告。原始答案如下...

get()函數返回底層的原始指針。你已經在你的代碼中寫下了這個!

shared_ptr<char> readInBuffer(new char[fileLength]); 
dictFile.read(readInBuffer.get(), fileLength); 

使用&*readInBuffer可以獲得相同的結果。

當然,你必須確定dictFile.read()不是delete指針,否則惡魔可能會飛出你的鼻子。

+0

沒有自定義刪除器,'unique_ptr'將簡單地調用存儲的指針上的'delete p'。由於內存是使用new new分配的,因此會產生未定義的行爲。 –

+0

哎喲,是的,你說得對。我會在這裏留下並添加一個很大的警告。 – Thomas

+0

哎喲,回來。 ''當我的意思是'shared_ptr'時,我的評論最終討論了'unique_ptr'。 'shared_ptr'根本不處理數組; 'shared_ptr'沒有自定義的刪除器。雖然'unique_ptr'可以在這裏使用。 –

5

而不是使用指針,您可以使用矢量。

std::vector<char> readInBuffer(fileLength); 
dictFile.read(&readInBuffer[0], fileLength); 
+0

矢量絕招好...所以,當API需要一個原始指針時,沒有辦法傳入一個智能ptr? –

1

不,你不能通過shared_ptr。但是你可以創建一個,並調用它的get()成員函數來獲取傳遞給該函數的原始指針的副本。但是,shared_ptr不處理數組;這就是vector的用途。但是你可以使用一個unique_ptr到陣列來管理對象:

std::unique_ptr<char[], std::default_delete<char[]> ptr(new char[whatever]); 
f(ptr.get()); 

有可能會寫第一線較短的方式,但我沒有時間把它挖出來了。

相關問題