/** Автоматическое закрытие файла с подсчётом ссылок. */ /** Полезно отдавать дескрипторы во владение объектам, которые при уничтожении закрывают этот дескриптор (RAII). Чаще это делается так: */ struct holder { holder(int fd): m_fd(fd) {} ~holder() { ::close(fd); } private: const int m_fd; }; /** Минус данного подхода - нет счётчика ссылок. Для объектов типа FILE* можно было бы использовать так: */ boost::shared_ptr<FILE> file(fopen(), fclose_check); /** Вторым аргументом указывается функтор, удаляющий объект, который проверяет, что входной аргумент не NULL, иначе SIGSEGV */ /** Но что делать для типов не являющихся указателями? Есть решение: */ template <typename T> struct shared_descriptor: public boost::shared_ptr<T> { template <typename D> shared_descriptor(T value, D deleter) : boost::shared_ptr<T>(new T(value), boost::bind(deleter, value)) , m_value(get()) {} private: boost::shared_ptr<T> m_value; }; /** Пример: */ boost::shared_ptr<int> file1 = shared_descriptor<int>(open("file.txt"), close); std::cout << "descriptor: " << *file << std::endl;
среда, 21 августа 2013 г.
shared descriptor
Подписаться на:
Комментарии к сообщению (Atom)
Комментариев нет:
Отправить комментарий