освобождение памяти в callback
От: Hard_Club  
Дата: 06.03.19 05:21
Оценка:
Что делать есть либа требует передачи в функцию raw поинтера и освобождения его в callback — никак его в smart pointer не завернешь.
Re: освобождение памяти в callback
От: Stanislav V. Zudin Россия  
Дата: 06.03.19 06:01
Оценка: +2
Здравствуйте, Hard_Club, Вы писали:

H_C>Что делать есть либа требует передачи в функцию raw поинтера и освобождения его в callback — никак его в smart pointer не завернешь.


Моё ИМХО: при передаче указателя в либу меняется владение указателем. Теперь либа отвечает за освобождение памяти. Она и дернет твой колбек в нужный момент. Значит нужно в момент передачи вызвать release() у смартпоинтера и не забивать себе голову.
_____________________
С уважением,
Stanislav V. Zudin
Re: освобождение памяти в callback
От: Maniacal Россия  
Дата: 06.03.19 06:01
Оценка:
Здравствуйте, Hard_Club, Вы писали:

H_C>Что делать есть либа требует передачи в функцию raw поинтера и освобождения его в callback — никак его в smart pointer не завернешь.


Интересный подход, я бы не додумался. А так — очень плохая идея резервировать память в исполняемом модуле, а освобождать в либе и наоборот. Если использовать smart pointer, то именно это и произойдёт.
Re: освобождение памяти в callback
От: B0FEE664  
Дата: 06.03.19 11:01
Оценка: +2
Здравствуйте, Hard_Club, Вы писали:

H_C>Что делать есть либа требует передачи в функцию raw поинтера и освобождения его в callback — никак его в smart pointer не завернешь.


В предположении однопоточности либы:
Построить глобальный мап, типа:
std::map<T*, std::shared_ptr<T> g_map;

перед передачей указателя в либу делать:

std::shared_ptr<MyObject> pObj = ...

g_map[pObj.get()] = pObj;
LibApiFunction(pObj.get());


в callback удалять из мапа:
SomeCallback(MyObject* ptr)
{
  g_map.erase(ptr);
}
И каждый день — без права на ошибку...
Отредактировано 06.03.2019 14:57 B0FEE664 . Предыдущая версия .
Re: освобождение памяти в callback
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 06.03.19 12:56
Оценка:
Здравствуйте, Hard_Club, Вы писали:

H_C>Что делать есть либа требует передачи в функцию raw поинтера и освобождения его в callback — никак его в smart pointer не завернешь.

У тебя есть опасения что либа может забыть вызвать коллбэк для конкретного указателя?
Sic luceat lux!
Re[2]: освобождение памяти в callback
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 06.03.19 12:58
Оценка:
Здравствуйте, Maniacal, Вы писали:

M>Интересный подход, я бы не додумался. А так — очень плохая идея резервировать память в исполняемом модуле, а освобождать в либе и наоборот.

Он не освобождает в либе. Тут как раз создание и удаления происходит именно в коде пользователя либы, т.е. в колбэке и при создании объекта. Это сделано для обхода граблей при разных crt.
Sic luceat lux!
Re[3]: освобождение памяти в callback
От: Maniacal Россия  
Дата: 06.03.19 13:08
Оценка:
Здравствуйте, Kernan, Вы писали:

K>Здравствуйте, Maniacal, Вы писали:


M>>Интересный подход, я бы не додумался. А так — очень плохая идея резервировать память в исполняемом модуле, а освобождать в либе и наоборот.

K>Он не освобождает в либе. Тут как раз создание и удаления происходит именно в коде пользователя либы, т.е. в колбэке и при создании объекта. Это сделано для обхода граблей при разных crt.

Я и говорю. Прекрасный подход. А вот если смартпоинтер передавать, то освобождение будет в либе. Это если при передаче сразу release делать.
Re: освобождение памяти в callback
От: Videoman Россия https://hts.tv/
Дата: 06.03.19 17:03
Оценка:
Здравствуйте, Hard_Club, Вы писали:

H_C>Что делать есть либа требует передачи в функцию raw поинтера и освобождения его в callback — никак его в smart pointer не завернешь.


А можно поинтересоваться, какая сигнатура у caallback, есть ли какой-нибудь opaque или context?
Re[2]: освобождение памяти в callback
От: Hard_Club  
Дата: 06.03.19 19:07
Оценка:
BFE>В предположении однопоточности либы:
BFE>Построить глобальный мап, типа:
BFE>
BFE>std::map<T*, std::shared_ptr<T> g_map;
BFE>

BFE>перед передачей указателя в либу делать:

А чем может быть оправдано добавление стольких лищних кострукций?
Re[2]: освобождение памяти в callback
От: Hard_Club  
Дата: 06.03.19 19:09
Оценка:
V>А можно поинтересоваться, какая сигнатура у caallback, есть ли какой-нибудь opaque или context?

Она возвращает тот же raw pointer
Re[2]: освобождение памяти в callback
От: Hard_Club  
Дата: 06.03.19 19:09
Оценка:
K>У тебя есть опасения что либа может забыть вызвать коллбэк для конкретного указателя?

да меня везде приучили к смарт-поинткрам
Re[3]: освобождение памяти в callback
От: B0FEE664  
Дата: 06.03.19 20:08
Оценка: 2 (1) +1
Здравствуйте, Hard_Club, Вы писали:

H_C>А чем может быть оправдано добавление стольких лищних кострукций?

Всего три дополнительные строчки, хотя, конечно, тут предполагается, что объекты уникальны с пределах использования библиотеки.

Такой код бывает нужен, если
— используется событийная модель обработки с неизвестным порядком событий;
— время жизни объекта может зависит от стороннего кода ещё одной библиотеки;
— существует сложная зависимость жизни одного объекта от жизни другого.
И каждый день — без права на ошибку...
[UPD] Re: освобождение памяти в callback
От: ononim  
Дата: 07.03.19 07:30
Оценка: +1
H_C>Что делать есть либа требует передачи в функцию raw поинтера и освобождения его в callback — никак его в smart pointer не завернешь.
В boost::intrusive_ptr завернешь
[UPD]
Ну или положить в сам объект shared_ptr на самого себя. При отдаче в либу — устанавливать, при освобождении из либы — делать ему reset.
Как много веселых ребят, и все делают велосипед...
Отредактировано 07.03.2019 7:35 ononim . Предыдущая версия .
Re[3]: освобождение памяти в callback
От: flаt  
Дата: 07.03.19 11:27
Оценка:
Здравствуйте, Hard_Club, Вы писали:

H_C>А чем может быть оправдано добавление стольких лищних кострукций?



Имхо, ничем, кроме

да меня везде приучили к смарт-поинткрам

Re: освобождение памяти в callback
От: Mr.Delphist  
Дата: 07.03.19 17:45
Оценка:
Здравствуйте, Hard_Club, Вы писали:

H_C>Что делать есть либа требует передачи в функцию raw поинтера и освобождения его в callback — никак его в smart pointer не завернешь.


А какой именно по семантике smart-pointer используется (unique, shared etc)? Можно постараться кастомный deleter пристыковать, например.
Re[4]: освобождение памяти в callback
От: SaZ  
Дата: 08.03.19 22:14
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Здравствуйте, Hard_Club, Вы писали:


H_C>>А чем может быть оправдано добавление стольких лищних кострукций?

BFE>Всего три дополнительные строчки, хотя, конечно, тут предполагается, что объекты уникальны с пределах использования библиотеки.

BFE>Такой код бывает нужен, если

BFE>- используется событийная модель обработки с неизвестным порядком событий;
BFE>- время жизни объекта может зависит от стороннего кода ещё одной библиотеки;
BFE>- существует сложная зависимость жизни одного объекта от жизни другого.

Делал такое на одном проекте, где нужно было железякой управлять через thirdparty dll
Re[3]: освобождение памяти в callback
От: IID Россия  
Дата: 15.03.19 06:37
Оценка:
Здравствуйте, Kernan, Вы писали:

K>Тут как раз создание и удаления происходит именно в коде пользователя либы, т.е. в колбэке и при создании объекта. Это сделано для обхода граблей при разных crt.


Так может надо было в либе создавать ? Create/Release для каждого объекта, как в WinAPI.
kalsarikännit
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.