Я думаю, что мне нужно управлять временем жизни std::function
Да, я говорил вам столько же, когда говорил вам сохранить указатель в управляемой оболочке, здесь
Я не знаю о времени жизни объекта функции, на который указывает управляемый класс.
std::function
является нативным объект и следует родным правилам C ++. Помещение указателя в управляемую оболочку не сделает его сборщиком мусора.
Кажется, что объект удален, а управляемый класс остается с висящим указателем.
Да, ваша терминология не точна, но вы правильно диагностировали проблему. Взгляните:
void dispatchEvent(std::function<void(int)> processEvent)
{
Iface::Wrapper wrapper;
wrapper.callback = &processEvent;
wrapper.PassCallback();
}
processEvent
- аргумент функции, объект std::function
, переданный по значению. Копия, сделанная и сохраненная в аргументе, действует до конца области видимости. Имеет автомат c срок хранения. Когда функция возвращается, все локальные переменные, включая аргументы функции, уничтожаются (не «удаляются»).
Вам потребуется динамически выделить (копию) объекта std::function
, например:
typedef std::function<void(int)> cbfn;
wrapper.callback = new cbfn(processEvent);
Теперь у вас утечка памяти, но, по крайней мере, вы не используете объект после его уничтожения. Если вы сделаете только несколько таких объектов, утечка может быть даже приемлемой. В общем случае вы должны реализовать IDisposable
в своей оболочке и иметь метод Dispose
do delete callback;
. В C ++ / CLI вы используете синтаксис деструктора для выполнения sh этого.
~Wrapper()
{
delete callback;
callback = nullptr;
}