diff --git a/compiler/finput.pas b/compiler/finput.pas
index 76ec3ff4a7..b325f2fa03 100644
--- a/compiler/finput.pas
+++ b/compiler/finput.pas
@@ -118,7 +118,11 @@ uses
 {$else Delphi}
   dos,
 {$endif Delphi}
-  cobjects,globals;
+  cobjects,globals
+{$ifdef heaptrc}
+  ,fmodule
+{$endif heaptrc}
+  ;
 
 {****************************************************************************
                                   TINPUTFILE
@@ -564,7 +568,10 @@ uses
 end.
 {
   $Log$
-  Revision 1.2  2000-09-24 15:06:16  peter
+  Revision 1.3  2000-10-14 21:52:54  peter
+    * fixed memory leaks
+
+  Revision 1.2  2000/09/24 15:06:16  peter
     * use defines.inc
 
   Revision 1.1  2000/08/27 16:11:50  peter
diff --git a/compiler/n386mem.pas b/compiler/n386mem.pas
index 4e6c3991f7..df1d207e91 100644
--- a/compiler/n386mem.pas
+++ b/compiler/n386mem.pas
@@ -702,6 +702,7 @@ implementation
                         secondpass(hightree);
                         emit_mov_loc_ref(hightree.location,href,S_L,true);
                         hightree.free;
+                        hightree:=nil;
                       end;
                      emitrangecheck(right,left.resulttype);
                    end;
@@ -1016,7 +1017,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.1  2000-10-14 10:14:49  peter
+  Revision 1.2  2000-10-14 21:52:54  peter
+    * fixed memory leaks
+
+  Revision 1.1  2000/10/14 10:14:49  peter
     * moehrendorf oct 2000 rewrite
 
 }
\ No newline at end of file
diff --git a/compiler/n386util.pas b/compiler/n386util.pas
index 0ad16af9b7..51d9e0c600 100644
--- a/compiler/n386util.pas
+++ b/compiler/n386util.pas
@@ -55,8 +55,9 @@ implementation
        globtype,globals,systems,verbose,
        cutils,cobjects,
        aasm,cpubase,cpuasm,
+       symconst,
 {$ifdef GDB}
-       gdb,symconst,
+       gdb,
 {$endif GDB}
        types,
        ncon,nld,
@@ -1148,6 +1149,7 @@ implementation
            secondpass(hightree);
            push_value_para(hightree,false,false,0,4);
            hightree.free;
+           hightree:=nil;
          end
         else
          begin
@@ -1313,7 +1315,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.2  2000-10-14 10:14:50  peter
+  Revision 1.3  2000-10-14 21:52:54  peter
+    * fixed memory leaks
+
+  Revision 1.2  2000/10/14 10:14:50  peter
     * moehrendorf oct 2000 rewrite
 
   Revision 1.1  2000/10/01 19:58:40  peter
diff --git a/compiler/nbas.pas b/compiler/nbas.pas
index be798aef89..13c0ec3c97 100644
--- a/compiler/nbas.pas
+++ b/compiler/nbas.pas
@@ -44,6 +44,7 @@ interface
        tasmnode = class(tnode)
           p_asm : paasmoutput;
           constructor create(p : paasmoutput);virtual;
+          destructor destroy;override;
           function pass_1 : tnode;override;
        end;
 
@@ -311,6 +312,12 @@ implementation
          p_asm:=p;
       end;
 
+    destructor tasmnode.destroy;
+      begin
+        if assigned(p_asm) then
+         dispose(p_asm,done);
+        inherited destroy;
+      end;
 
     function tasmnode.pass_1 : tnode;
       begin
@@ -327,7 +334,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.1  2000-10-14 10:14:50  peter
+  Revision 1.2  2000-10-14 21:52:54  peter
+    * fixed memory leaks
+
+  Revision 1.1  2000/10/14 10:14:50  peter
     * moehrendorf oct 2000 rewrite
 
 }
\ No newline at end of file
diff --git a/compiler/ncal.pas b/compiler/ncal.pas
index c0ad82fa56..a20344e6ed 100644
--- a/compiler/ncal.pas
+++ b/compiler/ncal.pas
@@ -76,6 +76,7 @@ interface
           inlineprocsym : pprocsym;
           retoffset,para_offset,para_size : longint;
           constructor create(callp,code : tnode);virtual;
+          destructor destroy;override;
           function getcopy : tnode;override;
           function pass_1 : tnode;override;
        end;
@@ -1239,6 +1240,7 @@ interface
                              tcallparanode(left).left);
                            tcallparanode(left).left:=nil;
                            left.free;
+                           left:=nil;
                          end;
                      end
                    else
@@ -1487,6 +1489,12 @@ interface
       {$ENDIF NEWST}
       end;
 
+    destructor tprocinlinenode.destroy;
+      begin
+        inlinetree.free;
+        inherited destroy;
+      end;
+
     function tprocinlinenode.getcopy : tnode;
 
       var
@@ -1521,7 +1529,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.9  2000-10-14 10:14:50  peter
+  Revision 1.10  2000-10-14 21:52:55  peter
+    * fixed memory leaks
+
+  Revision 1.9  2000/10/14 10:14:50  peter
     * moehrendorf oct 2000 rewrite
 
   Revision 1.8  2000/10/01 19:48:24  peter
@@ -1548,4 +1559,4 @@ end.
   Revision 1.1  2000/09/20 20:52:16  florian
     * initial revision
 
-}
+}
\ No newline at end of file
diff --git a/compiler/ncnv.pas b/compiler/ncnv.pas
index 56d2b66478..24985256db 100644
--- a/compiler/ncnv.pas
+++ b/compiler/ncnv.pas
@@ -183,12 +183,15 @@ implementation
             {split a range into p2 and p3 }
               if p.left.nodetype=arrayconstructorrangen then
                begin
-                 p2:=tarrayconstructorrangenode(p.left).left.getcopy;
-                 p3:=tarrayconstructorrangenode(p.left).right.getcopy;
+                 p2:=tarrayconstructorrangenode(p.left).left;
+                 p3:=tarrayconstructorrangenode(p.left).right;
+                 tarrayconstructorrangenode(p.left).left:=nil;
+                 tarrayconstructorrangenode(p.left).right:=nil;
                end
               else
                begin
-                 p2:=p.left.getcopy;
+                 p2:=p.left;
+                 p.left:=nil;
                  p3:=nil;
                end;
               firstpass(p2);
@@ -843,8 +846,8 @@ implementation
                        else
                         hp:=genloadcallnode(pprocsym(tcallnode(left).symtableprocentry),
                           tcallnode(left).symtableproc);
-                       left.free;
                        firstpass(hp);
+                       left.free;
                        left:=hp;
                        aprocdef:=pprocdef(left.resulttype);
                    (*  end
@@ -1160,7 +1163,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.7  2000-10-14 10:14:50  peter
+  Revision 1.8  2000-10-14 21:52:55  peter
+    * fixed memory leaks
+
+  Revision 1.7  2000/10/14 10:14:50  peter
     * moehrendorf oct 2000 rewrite
 
   Revision 1.6  2000/10/01 19:48:24  peter
@@ -1180,4 +1186,4 @@ end.
 
   Revision 1.1  2000/09/25 15:37:14  florian
     * more fixes
-}
+}
\ No newline at end of file
diff --git a/compiler/ncon.pas b/compiler/ncon.pas
index a892b1b7c5..1c605b371c 100644
--- a/compiler/ncon.pas
+++ b/compiler/ncon.pas
@@ -66,6 +66,7 @@ interface
           stringtype : tstringtype;
           constructor createstr(const s : string;st:tstringtype);virtual;
           constructor createpchar(s : pchar;l : longint);virtual;
+          destructor destroy;override;
           function getcopy : tnode;override;
           function pass_1 : tnode;override;
           function getpcharcopy : pchar;
@@ -75,6 +76,7 @@ interface
           value_set : pconstset;
           lab_set : pasmlabel;
           constructor create(s : pconstset;settype : psetdef);virtual;
+          destructor destroy;override;
           function getcopy : tnode;override;
           function pass_1 : tnode;override;
        end;
@@ -124,7 +126,7 @@ interface
 implementation
 
     uses
-      cobjects,verbose,globals,systems,
+      cutils,cobjects,verbose,globals,systems,
       types,hcodegen,pass_1,cpubase,nld;
 
     function genordinalconstnode(v : tconstexprint;def : pdef) : tordconstnode;
@@ -500,6 +502,12 @@ implementation
          lab_str:=nil;
       end;
 
+    destructor tstringconstnode.destroy;
+      begin
+        ansistringdispose(value_str,len);
+        inherited destroy;
+      end;
+
     function tstringconstnode.getcopy : tnode;
 
       var
@@ -561,6 +569,13 @@ implementation
            value_set:=nil;
       end;
 
+    destructor tsetconstnode.destroy;
+      begin
+        if assigned(value_set) then
+         dispose(value_set);
+        inherited destroy;
+      end;
+
     function tsetconstnode.getcopy : tnode;
 
       var
@@ -613,7 +628,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.8  2000-10-14 10:14:50  peter
+  Revision 1.9  2000-10-14 21:52:55  peter
+    * fixed memory leaks
+
+  Revision 1.8  2000/10/14 10:14:50  peter
     * moehrendorf oct 2000 rewrite
 
   Revision 1.7  2000/09/28 19:49:52  florian
diff --git a/compiler/nflw.pas b/compiler/nflw.pas
index 8ace0cc356..477c6aac51 100644
--- a/compiler/nflw.pas
+++ b/compiler/nflw.pas
@@ -108,6 +108,7 @@ interface
           exceptsymtable : psymtable;
           excepttype : pobjectdef;
           constructor create(l,r:tnode);virtual;
+          destructor destroy;override;
           function pass_1 : tnode;override;
           function getcopy : tnode;override;
        end;
@@ -193,10 +194,8 @@ implementation
     destructor tloopnode.destroy;
 
       begin
-         if assigned(t1) then
-          t1.free;
-         if assigned(t2) then
-          t2.free;
+         t1.free;
+         t2.free;
          inherited destroy;
       end;
 
@@ -881,6 +880,13 @@ implementation
          excepttype:=nil;
       end;
 
+    destructor tonnode.destroy;
+      begin
+        if assigned(exceptsymtable) then
+         dispose(exceptsymtable,done);
+        inherited destroy;
+      end;
+
     function tonnode.getcopy : tnode;
 
       var
@@ -976,7 +982,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.6  2000-10-14 10:14:50  peter
+  Revision 1.7  2000-10-14 21:52:55  peter
+    * fixed memory leaks
+
+  Revision 1.6  2000/10/14 10:14:50  peter
     * moehrendorf oct 2000 rewrite
 
   Revision 1.5  2000/10/01 19:48:24  peter
diff --git a/compiler/nmem.pas b/compiler/nmem.pas
index df3f56ff29..19f1023b12 100644
--- a/compiler/nmem.pas
+++ b/compiler/nmem.pas
@@ -91,13 +91,13 @@ interface
 {$IFDEF NEWST}
           withsymtables : Pcollection;
           withreference : preference;
-
 {$ELSE}
           withsymtable : pwithsymtable;
           tablecount : longint;
           withreference:preference;
 {$ENDIF NEWST}
           constructor create(symtable : pwithsymtable;l,r : tnode;count : longint);virtual;
+          destructor destroy;override;
           function getcopy : tnode;override;
           function pass_1 : tnode;override;
        end;
@@ -423,7 +423,7 @@ implementation
 
                     { it could also be a procvar, not only pprocsym ! }
                        if tcallnode(left).symtableprocentry^.typ=varsym then
-                        hp3:=pabstractprocdef(pvarsym(tloadnode(left).symtableentry)^.vartype.def)
+                        hp3:=pabstractprocdef(pvarsym(tcallnode(left).symtableprocentry)^.vartype.def)
                        else
                         hp3:=pabstractprocdef(pprocsym(tcallnode(left).symtableprocentry)^.definition);
 
@@ -829,6 +829,28 @@ implementation
          set_file_line(l);
       end;
 
+    destructor twithnode.destroy;
+      var
+        symt : psymtable;
+        i    : longint;
+      begin
+{$IFDEF NEWST}
+        dispose(withsymtables,done);
+{$ELSE}
+        symt:=withsymtable;
+        for i:=1 to tablecount do
+         begin
+           if assigned(symt) then
+            begin
+              withsymtable:=pwithsymtable(symt^.next);
+              dispose(symt,done);
+            end;
+           symt:=withsymtable;
+         end;
+{$ENDIF NEWST}
+        inherited destroy;
+      end;
+
     function twithnode.getcopy : tnode;
 
       var
@@ -882,7 +904,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.6  2000-10-14 10:14:51  peter
+  Revision 1.7  2000-10-14 21:52:55  peter
+    * fixed memory leaks
+
+  Revision 1.6  2000/10/14 10:14:51  peter
     * moehrendorf oct 2000 rewrite
 
   Revision 1.5  2000/10/01 19:48:24  peter
diff --git a/compiler/node.inc b/compiler/node.inc
index d3e381a437..8a3aebfe89 100644
--- a/compiler/node.inc
+++ b/compiler/node.inc
@@ -62,9 +62,10 @@
 
       begin
          { reference info }
-         if (location.loc in [LOC_MEM,LOC_REFERENCE]) and
+         {if (location.loc in [LOC_MEM,LOC_REFERENCE]) and
             assigned(location.reference.symbol) then
-           dispose(location.reference.symbol,done);
+           dispose(location.reference.symbol,done);}
+
 {$ifdef EXTDEBUG}
          if firstpasscount>maxfirstpasscount then
             maxfirstpasscount:=firstpasscount;
@@ -264,6 +265,12 @@
          left:=l;
       end;
 
+    destructor tunarynode.destroy;
+      begin
+        left.free;
+        inherited destroy;
+      end;
+
     function tunarynode.docompare(p : tnode) : boolean;
 
       begin
@@ -345,6 +352,12 @@
          right:=r
       end;
 
+    destructor tbinarynode.destroy;
+      begin
+        right.free;
+        inherited destroy;
+      end;
+
     procedure tbinarynode.concattolist(l : plinkedlist);
 
       begin
@@ -489,7 +502,10 @@
 
 {
   $Log$
-  Revision 1.9  2000-10-14 10:14:51  peter
+  Revision 1.10  2000-10-14 21:52:55  peter
+    * fixed memory leaks
+
+  Revision 1.9  2000/10/14 10:14:51  peter
     * moehrendorf oct 2000 rewrite
 
   Revision 1.8  2000/10/01 19:48:24  peter
diff --git a/compiler/nodeh.inc b/compiler/nodeh.inc
index 7f899a0873..cd51e58d26 100644
--- a/compiler/nodeh.inc
+++ b/compiler/nodeh.inc
@@ -258,6 +258,7 @@
        tunarynode = class(tparentnode)
           left : tnode;
           constructor create(tt : tnodetype;l : tnode);
+          destructor destroy;override;
           procedure concattolist(l : plinkedlist);override;
           function ischild(p : tnode) : boolean;override;
           procedure det_resulttype;override;
@@ -274,6 +275,7 @@
        tbinarynode = class(tunarynode)
           right : tnode;
           constructor create(tt : tnodetype;l,r : tnode);
+          destructor destroy;override;
           procedure concattolist(l : plinkedlist);override;
           function ischild(p : tnode) : boolean;override;
           procedure det_resulttype;override;
@@ -302,7 +304,10 @@
 
 {
   $Log$
-  Revision 1.12  2000-10-14 10:14:51  peter
+  Revision 1.13  2000-10-14 21:52:55  peter
+    * fixed memory leaks
+
+  Revision 1.12  2000/10/14 10:14:51  peter
     * moehrendorf oct 2000 rewrite
 
   Revision 1.11  2000/10/01 19:48:24  peter
diff --git a/compiler/og386elf.pas b/compiler/og386elf.pas
index 372481647f..ae75377d8a 100644
--- a/compiler/og386elf.pas
+++ b/compiler/og386elf.pas
@@ -323,6 +323,8 @@ interface
       begin
         if assigned(Data) then
           dispose(Data,done);
+        if assigned(relocsect) then
+          dispose(relocsect,done);
       end;
 
 
@@ -473,7 +475,11 @@ interface
         sec : tsection;
       begin
         writetodisk;
+        { free memory }
         dispose(syms,done);
+        dispose(symtabsect,done);
+        dispose(strtabsect,done);
+        dispose(shstrtabsect,done);
         for sec:=low(tsection) to high(tsection) do
          if assigned(sects[sec]) then
           dispose(sects[sec],done);
@@ -1050,7 +1056,10 @@ interface
 end.
 {
   $Log$
-  Revision 1.7  2000-09-24 15:06:20  peter
+  Revision 1.8  2000-10-14 21:52:55  peter
+    * fixed memory leaks
+
+  Revision 1.7  2000/09/24 15:06:20  peter
     * use defines.inc
 
   Revision 1.6  2000/08/27 16:11:51  peter
diff --git a/compiler/ppheap.pas b/compiler/ppheap.pas
index 04285b7864..c473a8f93f 100644
--- a/compiler/ppheap.pas
+++ b/compiler/ppheap.pas
@@ -36,7 +36,7 @@ interface
 implementation
 
     uses
-       globtype,globals,files;
+       globtype,globals,fmodule;
 
     procedure ppextra_info(p : pointer);
       var pl : plongint;
@@ -70,7 +70,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.3  2000-09-24 15:06:24  peter
+  Revision 1.4  2000-10-14 21:52:56  peter
+    * fixed memory leaks
+
+  Revision 1.3  2000/09/24 15:06:24  peter
     * use defines.inc
 
   Revision 1.2  2000/07/13 11:32:45  michael
diff --git a/compiler/pstatmnt.pas b/compiler/pstatmnt.pas
index 87ad4afa7c..f015c4f82d 100644
--- a/compiler/pstatmnt.pas
+++ b/compiler/pstatmnt.pas
@@ -874,7 +874,9 @@ implementation
             if (pd^.deftype<>pointerdef) then
               begin
                  Message1(type_e_pointer_type_expected,pd^.typename);
+                 p.free;
                  p:=factor(false);
+                 p.free;
                  consume(_RKLAMMER);
                  new_dispose_statement:=cerrornode.create;
                  exit;
@@ -883,6 +885,7 @@ implementation
             if ppointerdef(pd)^.pointertype.def^.deftype<>objectdef then
               begin
                  Message(parser_e_pointer_to_class_expected);
+                 p.free;
                  new_dispose_statement:=factor(false);
                  consume_all_until(_RKLAMMER);
                  consume(_RKLAMMER);
@@ -912,6 +915,7 @@ implementation
                   Message(parser_e_expr_have_to_be_constructor_call)
                  else
                   Message(parser_e_expr_have_to_be_destructor_call);
+                 p.free;
                  new_dispose_statement:=cerrornode.create;
               end
             else
@@ -960,7 +964,7 @@ implementation
                     begin
                       if (tcallnode(p2).procdefinition^.proctypeoption<>potype_constructor) then
                         Message(parser_e_expr_have_to_be_constructor_call);
-                      p2:=cassignmentnode.create(p.getcopy,cnewnode.create(p2));
+                      p2:=cassignmentnode.create(p,cnewnode.create(p2));
                       tassignmentnode(p2).right.resulttype:=pd2;
                     end
                    else
@@ -1254,7 +1258,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.10  2000-10-14 10:14:52  peter
+  Revision 1.11  2000-10-14 21:52:56  peter
+    * fixed memory leaks
+
+  Revision 1.10  2000/10/14 10:14:52  peter
     * moehrendorf oct 2000 rewrite
 
   Revision 1.9  2000/10/01 19:48:25  peter