我寫過一個函數,它將字節加載到文件中,並返回包含字節緩衝區和緩衝區長度的FileData結構體。在一個結構體或類中使用智能指針
我想緩衝區一旦被消耗並被拋出作用域就被刪除。
我很難讓它編譯,由於各種鑄造錯誤。另外,我不確定緩衝區是否被正確移動而不是被複制。我不介意FileData結構本身被複制,因爲它最多可能是16個字節。
一般來說,你如何使用智能指針作爲類/結構域?這甚至是你會做的嗎?
這是一個含糊不清的問題,我知道,但由於我在智能指針方面有一些概念上的困難,我希望這個例子能幫助我走向正確的方向。
這裏是我到目前爲止有:
struct FileData
{
unique_ptr<char[]> buf;
unsigned int len;
};
FileData LoadFile(string filename)
{
ifstream str;
str.open(filename, ios::binary);
str.seekg(0, ios::end);
auto len = str.tellg();
str.seekg(0, ios::beg);
char* buf = new char[len];
str.read(buf, len);
str.close();
FileData d = { unique_ptr<char[]>(buf), len };
return d;
}
編輯:由於一些人好奇的錯誤消息,我這個當前的代碼得到的,那就是:
error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'
您的問題是,您根本不會提供關於錯誤消息的任何具體細節。我們究竟可以怎樣識別他們呢? – Puppy 2012-04-13 00:18:48
@DeadMG我認爲應該清楚代碼存在問題,因爲我確實指出我不確定這是使用智能指針並移動語義的正確方法。我希望代碼不僅僅是編譯;我希望它是正確和習慣的。儘管如此,我已經用錯誤信息更新了問題。 – 2012-04-13 00:23:37
你得到的錯誤是因爲你試圖複製一個unique_ptr,你必須使用std :: move。您可以使用shared_ptr並聲明自己的釋放器,但矢量解決方案更清晰。 – pstrjds 2012-04-13 00:26:19