- Fixed memory leak for cython disasm functions
diff --git a/bindings/python/pyx/ccapstone.pyx b/bindings/python/pyx/ccapstone.pyx
index 7b09748..e60f803 100644
--- a/bindings/python/pyx/ccapstone.pyx
+++ b/bindings/python/pyx/ccapstone.pyx
@@ -273,17 +273,18 @@
         detail = self._cs.detail
         arch = self._cs.arch
 
-        for i from 0 <= i < res:
-            if detail:
-                dummy = CsInsn(CsDetail(arch, <size_t>allinsn[i].detail))
-            else:
-                dummy = CsInsn(None)
+        try:
+            for i from 0 <= i < res:
+                if detail:
+                    dummy = CsInsn(CsDetail(arch, <size_t>allinsn[i].detail))
+                else:
+                    dummy = CsInsn(None)
 
-            dummy._raw = allinsn[i]
-            dummy._csh = self.csh
-            yield dummy
-
-        cc.cs_free(allinsn, res)
+                dummy._raw = allinsn[i]
+                dummy._csh = self.csh
+                yield dummy
+        finally:
+            cc.cs_free(allinsn, res)
 
 
     # Light function to disassemble binary. This is about 20% faster than disasm() because
@@ -299,11 +300,12 @@
 
         cdef res = cc.cs_disasm(self.csh, code, len(code), addr, count, &allinsn)
 
-        for i from 0 <= i < res:
-            insn = allinsn[i]
-            yield (insn.address, insn.size, insn.mnemonic, insn.op_str)
-
-        cc.cs_free(allinsn, res)
+        try:
+            for i from 0 <= i < res:
+                insn = allinsn[i]
+                yield (insn.address, insn.size, insn.mnemonic, insn.op_str)
+        finally:
+            cc.cs_free(allinsn, res)
 
 
 # print out debugging info