Я написал функцию, которая загружает байты из файла и возвращает структуру 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>'