我写过一个函数,它将字节加载到文件中,并返回包含字节缓冲区和缓冲区长度的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