【发布时间】:2012-04-13 00:09:53
【问题描述】:
我编写了一个函数,它从文件中加载字节并返回一个包含字节缓冲区和缓冲区长度的 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>'
【问题讨论】:
-
您的问题是您根本没有提供有关错误消息的任何具体细节。我们到底怎么可能识别它们?
-
@DeadMG 我认为很明显代码存在问题,因为我确实指出我不确定这是使用智能指针和移动语义的正确方法.我希望代码能做的不仅仅是编译;我希望它是正确的和惯用的。尽管如此,我还是用错误消息更新了问题。
-
你得到的错误是因为你试图复制一个 unique_ptr,你必须使用 std::move。您可以使用 shared_ptr 并声明您自己的释放器,但向量解决方案更简洁。
-
@pstrjds 我也这么认为。但是,当我这样做时,我得到了一个不同的错误(这就是我不想费心分享错误消息的原因):
error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>' -
@ReiMiyasaka - 无论如何,向量解决方案要干净得多,如果您使用的编译器支持 C++11 移动构造函数,那么它不会比复制结构更昂贵。
标签: c++ visual-c++ c++11 smart-pointers