Skip to content

Commit a34f852

Browse files
committed
fix: Safely capture this as weak_ptr
1 parent d7a2afb commit a34f852

File tree

1 file changed

+15
-2
lines changed

1 file changed

+15
-2
lines changed

package/cpp/ListenerManager.h

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,31 @@
88
#include <algorithm>
99
#include <functional>
1010
#include <list>
11+
#include <memory>
1112

1213
namespace margelo {
1314

14-
template <typename Callback> class ListenerManager {
15+
template <typename Callback> class ListenerManager : public std::enable_shared_from_this<ListenerManager<Callback>> {
1516
private:
17+
using TSelf = ListenerManager<Callback>;
1618
std::list<Callback> _listeners;
1719

20+
private:
21+
std::shared_ptr<ListenerManager<Callback>> shared() {
22+
return this->shared_from_this();
23+
}
24+
1825
public:
1926
Listener add(Callback listener) {
2027
_listeners.push_back(std::move(listener));
2128
auto id = --_listeners.end();
22-
return Listener([id, this]() { _listeners.erase(id); });
29+
auto weakThis = std::weak_ptr<TSelf>(shared());
30+
return Listener([id, weakThis]() {
31+
auto sharedThis = weakThis.lock();
32+
if (sharedThis) {
33+
sharedThis->_listeners.erase(id);
34+
}
35+
});
2336
}
2437

2538
const std::list<Callback>& getListeners() {

0 commit comments

Comments
 (0)