День добрый.
boost::shared_ptr можно использовать для закрытия хенделов таким образом:
void* hSomeHandle=CreateSomeHandle(...);
boost::shared_ptr<void> xxx( hSomeHandle, ::CloseHandle );
Теперь о проблеме имеется некоторая библиотека, в которой хендел — это int, а не void*.
Можно ли тут как-нибудь использовать буст?
Здравствуйте, Аноним, Вы писали:
А>Теперь о проблеме имеется некоторая библиотека, в которой хендел — это int, а не void*.
А>Можно ли тут как-нибудь использовать буст?
Конкретно int можно хранить как void*.
Можно хранить int* (соот-но, удалять и хендл, и потом память под int), тогда и с точки зрения стандарта всё хорошо.
Лично у меня есть такое
typedef handle<int, 0, void (&)(int), some_delete> h_int;
shared<h_int> p;
scoped<h_int> s;
weak<h_int> w = p;
Здравствуйте, VoidEx, Вы писали:
VE>Лично у меня есть такое
VE>VE>typedef handle<int, 0, void (&)(int), some_delete> h_int;
VE>shared<h_int> p;
VE>scoped<h_int> s;
VE>weak<h_int> w = p;
VE>
1. Поделись исходниками?
2. А зачем weak в случае хэндлов? С указателями понятно, чтоб избежать закольцовывания. Но с хэндлами проблема вроде бы не стоит. Хотя, если там какая-нибудь регистрация зависимостей...
Здравствуйте, VoidEx, Вы писали:
VE>Конкретно int можно хранить как void*.
Неудобно будет пользоватся. Нужно будет ручками преобразовывать в int.
Разве что такой вариант:
class IntHandle
{
public:
// добавить operator приведения к инту при желание
int getHandle()
{
return (int)data.get();
}
private:
boost::shared_ptr<void> data;
};
VE>Можно хранить int* (соот-но, удалять и хендл, и потом память под int), тогда и с точки зрения стандарта всё хорошо.
хипу дергать жалко
Здравствуйте, Кодт, Вы писали:
К>1. Поделись исходниками?
К>2. А зачем weak в случае хэндлов? С указателями понятно, чтоб избежать закольцовывания. Но с хэндлами проблема вроде бы не стоит. Хотя, если там какая-нибудь регистрация зависимостей...
1. Писал на коленке, вечером выложу
2. Ну раз написал shared, то почему б не сделать weak, кода не так много
Здравствуйте, VoidEx, Вы писали:
VE>2. Ну раз написал shared, то почему б не сделать weak, кода не так много
Можно совместное владение сделать на двусвязном списке (linked_ptr), тогда не потребуется динамически размещать счётчик на куче.
Правда, список придётся делать lock-free.
Ну и weak на linked — нетривиально...
... << RSDN@Home 1.2.0 alpha rev. 655>>