Написать обертку для работы с хэндлами файлов (аналог auto_ptr но для хэндлов)

223
21 марта 2017, 14:08

Написал вот такой простой код:

class FileHandleGuard
{
private:
    HANDLE hFile;
public:
    FileHandleGuard(char* fileName) {
        hFile = CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ, NULL,  OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,  NULL);  
    }
    FileHandleGuard(const FileHandleGuard& other) {
        this->hFile = other.hFile;
    }
    ~FileHandleGuard() {
        if (hFile != INVALID_HANDLE_VALUE)
            CloseHandle(hFile);
    }
};
void g(FileHandleGuard f) {
    cout << "g " << endl;
    //вот тут происходит ошибка в деструкторе
}
void someFunction() {
    FileHandleGuard fileHandle("D://myfile.txt");
    g(fileHandle);
}
int main() {
    someFunction();
    system("pause");
    return 0;
}

При передаче в функцию g мой умный указатель должен вести себя так же как и auto_ptr, т.е. когда передали в функцию - только эта функция владеет объектом а та функция, которая передала - уже не владеет На данный момент получаю ошибку: 0xC0000008: An invalid handle was specified.

Исходная постановка задачи написана в заголовке вопроса. И правильно ли вообще, что я использую Хэндл из библиотеки windows.h ?

Answer 1

Вы же сами написали, что при передаче в функцию (читай - копировании) передается владение, так что

FileHandleGuard(const FileHandleGuard& other) {
    this->hFile = other.hFile;
}

нужно переписать как

FileHandleGuard(FileHandleGuard& other) {
    this->hFile = other.hFile;
    other.hFile = INVALID_HANDLE_VALUE;
}

Кстати, соответственно нужно написать и оператор присваивания...

READ ALSO
Не корректно работает localStorage

Не корректно работает localStorage

Подскажите, почему некорректно работает localStorage в Safari и iOSЕсть две страницы

293
Нотификация в шторме

Нотификация в шторме

В общем пробую декоратор в ТС прямо практически из мануала

248
Смена баннера при обновлении страницы.

Смена баннера при обновлении страницы.

Как сделать смену баннера(фонового background:url(ing))при обновлении страницы, через js ?

214