Использование интеллектуальных указателей в структуре или классе

Я написал функцию, которая загружает байты из файла и возвращает структуру 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>'
6
задан ildjarn 13 April 2012 в 00:26
поделиться