Sample/AAGeometry: stop leaking linked list

Change-Id: I8bba87244becf1352e713c08aee355ebbd83e45f
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/227058
Auto-Submit: Hal Canary <halcanary@google.com>
Commit-Queue: Ben Wagner <bungeman@google.com>
Reviewed-by: Ben Wagner <bungeman@google.com>
diff --git a/samplecode/SampleAAGeometry.cpp b/samplecode/SampleAAGeometry.cpp
index c3c0f8d..14a2c60 100644
--- a/samplecode/SampleAAGeometry.cpp
+++ b/samplecode/SampleAAGeometry.cpp
@@ -7,16 +7,14 @@
 
 #include "include/core/SkBitmap.h"
 #include "include/core/SkCanvas.h"
+#include "include/core/SkString.h"
 #include "include/private/SkMacros.h"
+#include "include/utils/SkTextUtils.h"
 #include "samplecode/Sample.h"
 #include "src/core/SkGeometry.h"
+#include "src/core/SkPointPriv.h"
 #include "src/pathops/SkIntersections.h"
 #include "src/pathops/SkOpEdgeBuilder.h"
-// #include "SkPathOpsSimplifyAA.h"
-// #include "SkPathStroker.h"
-#include "include/core/SkString.h"
-#include "include/utils/SkTextUtils.h"
-#include "src/core/SkPointPriv.h"
 
 #if 0
 void SkStrokeSegment::dump() const {
@@ -781,7 +779,7 @@
 
 struct PathUndo {
     SkPath fPath;
-    PathUndo* fNext;
+    std::unique_ptr<PathUndo> fNext;
 };
 
 class AAGeometryView : public Sample {
@@ -813,7 +811,7 @@
     Button fJoinButton;
     Button fInOutButton;
     SkTArray<Stroke> fStrokes;
-    PathUndo* fUndo;
+    std::unique_ptr<PathUndo> fUndo;
     int fActivePt;
     int fActiveVerb;
     bool fHandlePathMove;
@@ -840,7 +838,6 @@
         , fBisectButton('b')
         , fJoinButton('j')
         , fInOutButton('|')
-        , fUndo(nullptr)
         , fActivePt(-1)
         , fActiveVerb(-1)
         , fHandlePathMove(true)
@@ -882,6 +879,14 @@
         init_buttonList();
     }
 
+    ~AAGeometryView() override {
+        // Free linked list without deep recursion.
+        std::unique_ptr<PathUndo> undo = std::move(fUndo);
+        while (undo) {
+            undo = std::move(undo->fNext);
+        }
+    }
+
     bool constructPath() {
         construct_path(fPath);
         return true;
@@ -894,32 +899,23 @@
         if (fUndo && fUndo->fPath == fPath) {
             return;
         }
-        PathUndo* undo = new PathUndo;
+        std::unique_ptr<PathUndo> undo(new PathUndo);
         undo->fPath = fPath;
-        undo->fNext = fUndo;
-        fUndo = undo;
+        undo->fNext = std::move(fUndo);
+        fUndo = std::move(undo);
     }
 
     bool undo() {
         if (!fUndo) {
             return false;
         }
-        fPath = fUndo->fPath;
+        fPath = std::move(fUndo->fPath);
+        fUndo = std::move(fUndo->fNext);
         validatePath();
-        PathUndo* next = fUndo->fNext;
-        delete fUndo;
-        fUndo = next;
         return true;
     }
 
-    void validatePath() {
-        PathUndo* undo = fUndo;
-        int match = 0;
-        while (undo) {
-            match += fPath == undo->fPath;
-            undo = undo->fNext;
-        }
-    }
+    void validatePath() {}
 
     void set_controlList(int index, UniControl* control, MyClick::ControlType type) {
         kControlList[index].fControl = control;