From b7c728a794668c905252e6719c6d25b0a9045a55 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Mon, 22 Jun 2015 15:40:02 -0700 Subject: [PATCH 1/2] assert AvatarMotionState unhooked before delete --- interface/src/avatar/Avatar.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index 731c69979e..0213afb675 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -107,6 +107,7 @@ Avatar::Avatar() : } Avatar::~Avatar() { + assert(_motionState == nullptr); for(auto attachment : _unusedAttachments) { delete attachment; } From ce9dfc098b0a9353bf9ceb8982e994497da12002 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Mon, 22 Jun 2015 15:40:26 -0700 Subject: [PATCH 2/2] unhook motionstate before removing avatar --- interface/src/avatar/AvatarManager.cpp | 12 +++++++----- interface/src/avatar/AvatarManager.h | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 51fae3439a..88f550d68c 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -114,6 +114,7 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { // DO NOT update or fade out uninitialized Avatars ++avatarIterator; } else if (avatar->shouldDie()) { + removeAvatarMotionState(avatar); _avatarFades.push_back(avatarIterator.value()); avatarIterator = _avatarHash.erase(avatarIterator); } else { @@ -163,12 +164,13 @@ AvatarSharedPointer AvatarManager::addAvatar(const QUuid& sessionUUID, const QWe } // protected -void AvatarManager::removeAvatarMotionState(Avatar* avatar) { - AvatarMotionState* motionState= avatar->_motionState; +void AvatarManager::removeAvatarMotionState(AvatarSharedPointer avatar) { + auto rawPointer = std::static_pointer_cast(avatar); + AvatarMotionState* motionState= rawPointer->_motionState; if (motionState) { // clean up physics stuff motionState->clearObjectBackPointer(); - avatar->_motionState = nullptr; + rawPointer->_motionState = nullptr; _avatarMotionStates.remove(motionState); _motionStatesToAdd.remove(motionState); _motionStatesToDelete.push_back(motionState); @@ -181,7 +183,7 @@ void AvatarManager::removeAvatar(const QUuid& sessionUUID) { if (avatarIterator != _avatarHash.end()) { std::shared_ptr avatar = std::dynamic_pointer_cast(avatarIterator.value()); if (avatar != _myAvatar && avatar->isInitialized()) { - removeAvatarMotionState(avatar.get()); + removeAvatarMotionState(avatar); _avatarFades.push_back(avatarIterator.value()); _avatarHash.erase(avatarIterator); } @@ -197,7 +199,7 @@ void AvatarManager::clearOtherAvatars() { // don't remove myAvatar or uninitialized avatars from the list ++avatarIterator; } else { - removeAvatarMotionState(avatar.get()); + removeAvatarMotionState(avatar); _avatarFades.push_back(avatarIterator.value()); avatarIterator = _avatarHash.erase(avatarIterator); } diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index b4482c5a34..9d1c94a47e 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -73,7 +73,7 @@ private: // virtual overrides virtual AvatarSharedPointer newSharedAvatar(); virtual AvatarSharedPointer addAvatar(const QUuid& sessionUUID, const QWeakPointer& mixerWeakPointer); - void removeAvatarMotionState(Avatar* avatar); + void removeAvatarMotionState(AvatarSharedPointer avatar); virtual void removeAvatar(const QUuid& sessionUUID); QVector _avatarFades;