Fix Signal
memory corruption issue
#1057
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Calling
Signal::connect
from within a signal callback called bySignal::emit
would update the underlyingstd::vector
, which would invalidate iterators. This was causing issues when control returned toSignal::emit
and it tried to call subsequent callbacks, which would be done using the invalidated iterator onstd::vector
memory that had already been freed. Since that memory was already freed, it was subject to re-allocation and corruption.Reference: OutpostUniverse/OPHD#1269
Valgrind for the win. It produced results much faster than my manual debugging attempts. Valgrind quickly pointed out use of already freed memory, and that this memory was both allocated and freed by the
std::vector::push_back
method, as used bySignalSource::connect
. Note that the same line inSignalSource::connect
callingpush_back
was responsible for both the memory allocation and deletion.