Я хочу создать оболочку RAII для файлового дескриптора. Поскольку объект может передаваться по потокам, он действительно является общим ресурсом: именно поэтому я сделал первую реализацию, используя shared_ptr
с пользовательским деструктором.
struct file_descriptor
{
file_descriptor( const std::string & pathname, int flags )
:m_fd( initialize( pathname, flags ) )
{
}
file_descriptor( const int opened_fd )
:m_fd( initialize( opened_fd ) )
{
}
operator int() const { return *m_fd; }
private:
std::shared_ptr<int> initialize( const int opened_fd )
{
std::shared_ptr<int> ptr_to_fd;
try
{
int * shared_fd = new int;
ptr_to_fd = std::shared_ptr<int>( shared_fd, file_descriptor_closer() );
*shared_fd = opened_fd;
}
catch( std::bad_alloc & )
{
close( opened_fd );
throw;
}
return ptr_to_fd;
}
std::shared_ptr<int> initialize( const std::string & pathname, int flags )
{
const int fd = open( pathname.c_str(), flags );
if (fd < 0)
throw std::system_error( std::error_code(errno, std::system_category() ), "cannot create file descriptor" );
return initialize( fd );
}
std::shared_ptr<int> m_fd;
};
Пользовательский деструктор довольно прост:
struct file_descriptor_closer
{
void operator()(int * const fd) noexcept { if (fd) close(*fd); delete fd; }
};
Теперь я нахожу дизайн ужасным, а именно из-за "new int". Я думал о создании специального распределителя, указывающего на уже выделенный блок, но это кажется излишним. Есть ли у вас, ребята, предложение упростить это?
std::shared_ptr<file_descriptor>
- person Captain Obvlious   schedule 02.03.2014shared_ptr
— это деталь реализации, скрытая от пользователей. - person qdii   schedule 02.03.2014shared_ptr
представляет семантику на всю жизнь и действительно не должна быть скрыта. Недостатки в дизайнеfile_descriptor
должны четко указывать на недостатки в остальной части вашего дизайна. Я предлагаю рассмотреть их в целом и использоватьstd::shared_ptr<file_descriptor>
, иначе ваш дизайн будет продолжать страдать и его будет все труднее поддерживать. - person Captain Obvlious   schedule 02.03.2014std::shared_ptr
как части реализации класса является недостатком? я не понимаю эту часть - person qdii   schedule 02.03.2014