Я написал функцию, которая загружает байты из файла и возвращает структуру 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;
}
Edit: Поскольку некоторые люди любопытно сообщение об ошибке, что я получаю с этим текущий код, здесь:
error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'
Ваша проблема в том, что вы вообще не сообщаете никаких конкретных сообщений об ошибках. Как мы можем, возможно, идентифицировать их еще? – Puppy
@DeadMG Я предположил, что было бы ясно, что есть проблемы с кодом, так как я заметил, что я не уверен, что это правильный способ использовать интеллектуальные указатели и перенести семантику. Я хотел бы, чтобы код делал больше, чем компилировал; Я бы хотел, чтобы это было правильно и идиоматично. Тем не менее, я обновил вопрос с сообщением об ошибке. –
Ошибка, которую вы получаете, заключается в том, что вы пытались скопировать уникальный_ptr, вам нужно использовать std :: move. Вы могли бы использовать shared_ptr и объявили свой собственный deallocator, но векторное решение намного чище. – pstrjds