diff --git a/src/Project.cpp b/src/Project.cpp
index d870ff7e1..fbde87380 100644
--- a/src/Project.cpp
+++ b/src/Project.cpp
@@ -2224,8 +2224,6 @@ void AudacityProject::OnToolBarUpdate(wxCommandEvent & event)
 // The projects tracklist has been updated
 void AudacityProject::OnTrackListDeletion(wxCommandEvent & event)
 {
-   GetSelectionState().TrackListUpdated( *GetTracks() );
-
    mViewInfo.track = NULL;
 
    event.Skip();
diff --git a/src/SelectionState.cpp b/src/SelectionState.cpp
index 03275d9b5..8aa2c12b7 100644
--- a/src/SelectionState.cpp
+++ b/src/SelectionState.cpp
@@ -61,7 +61,7 @@ void SelectionState::SelectTrack
 
    tracks.Select( &track, selected );
    if (updateLastPicked)
-      mLastPickedTrack = &track;
+      mLastPickedTrack = Track::Pointer( &track );
 
 //The older code below avoids an anchor on an unselected track.
 
@@ -70,12 +70,12 @@ void SelectionState::SelectTrack
       // This handles the case of linked tracks, selecting all channels
       mTracks->Select(pTrack, true);
       if (updateLastPicked)
-         mLastPickedTrack = pTrack;
+         mLastPickedTrack = Track::Pointer( pTrack );
    }
    else {
       mTracks->Select(pTrack, false);
-      if (updateLastPicked && pTrack == mLastPickedTrack)
-         mLastPickedTrack = nullptr;
+      if (updateLastPicked && pTrack == mLastPickedTrack.lock().get())
+         mLastPickedTrack.reset();
    }
 */
 
@@ -130,11 +130,9 @@ void SelectionState::ChangeSelectionOnShiftClick
    Track* pFirst = nullptr;
    Track* pLast = nullptr;
    // We will either extend from the first or from the last.
-   Track* pExtendFrom= nullptr;
+   auto pExtendFrom = mLastPickedTrack.lock();
 
-   if( mLastPickedTrack )
-      pExtendFrom = mLastPickedTrack;
-   else {
+   if( !pExtendFrom ) {
       TrackListIterator iter( &tracks );
       for (Track *t = iter.First(); t; t = iter.Next()) {
          const bool isSelected = t->GetSelected();
@@ -146,11 +144,11 @@ void SelectionState::ChangeSelectionOnShiftClick
          }
          // If our track is at or after the first, extend from the first.
          if( t == &track )
-            pExtendFrom = pFirst;
+            pExtendFrom = Track::Pointer( pFirst );
       }
       // Our track was earlier than the first.  Extend from the last.
       if( !pExtendFrom )
-         pExtendFrom = pLast;
+         pExtendFrom = Track::Pointer( pLast );
    }
 
    SelectNone( tracks, pMixerBoard );
@@ -170,7 +168,7 @@ void SelectionState::HandleListSelection
    if (ctrl)
       SelectTrack( tracks, track, !track.GetSelected(), true, pMixerBoard );
    else {
-      if (shift && mLastPickedTrack)
+      if (shift && mLastPickedTrack.lock())
          ChangeSelectionOnShiftClick( tracks, track, pMixerBoard );
       else {
          SelectNone( tracks, pMixerBoard );
@@ -183,12 +181,6 @@ void SelectionState::HandleListSelection
    }
 }
 
-void SelectionState::TrackListUpdated( const TrackList &tracks )
-{
-   if (mLastPickedTrack && !tracks.Contains(mLastPickedTrack))
-      mLastPickedTrack = nullptr;
-}
-
 SelectionStateChanger::SelectionStateChanger
 ( SelectionState &state, TrackList &tracks )
    : mpState{ &state }
diff --git a/src/SelectionState.h b/src/SelectionState.h
index 9797f8e21..19e1eae11 100644
--- a/src/SelectionState.h
+++ b/src/SelectionState.h
@@ -13,6 +13,7 @@ class Track;
 class TrackList;
 class MixerBoard;
 class ViewInfo;
+#include "MemoryX.h"
 #include <vector>
 
 // State relating to the set of selected tracks
@@ -36,12 +37,10 @@ public:
       ( TrackList &tracks, ViewInfo &viewInfo, Track &track,
         bool shift, bool ctrl, bool syncLocked, MixerBoard *pMixerBoard );
 
-   void TrackListUpdated( const TrackList &tracks );
-
 private:
    friend class SelectionStateChanger;
 
-   Track *mLastPickedTrack {};
+   std::weak_ptr<Track> mLastPickedTrack;
 };
 
 // For committing or rolling-back of changes in selectedness of tracks.
@@ -59,7 +58,7 @@ public:
 private:
    SelectionState *mpState;
    TrackList &mTracks;
-   Track *mInitialLastPickedTrack;
+   std::weak_ptr<Track> mInitialLastPickedTrack;
    std::vector<bool> mInitialTrackSelection;
 };