Написал вот такой простой код:
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
?
Вы же сами написали, что при передаче в функцию (читай - копировании) передается владение, так что
FileHandleGuard(const FileHandleGuard& other) {
this->hFile = other.hFile;
}
нужно переписать как
FileHandleGuard(FileHandleGuard& other) {
this->hFile = other.hFile;
other.hFile = INVALID_HANDLE_VALUE;
}
Кстати, соответственно нужно написать и оператор присваивания...
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Подскажите, почему некорректно работает localStorage в Safari и iOSЕсть две страницы
Как сделать смену баннера(фонового background:url(ing))при обновлении страницы, через js ?