Changeset 2732


Ignore:
Timestamp:
06/29/12 07:14:26 (2 years ago)
Author:
lowjoel
Message:

Merged revision(s) 2728, 2731 from branches/eraser6/6.0: Prevent unmanaged memory from leaking extravagantly because of the mixed types. Addresses http://eraser.heidi.ie/forum/viewtopic.php?f=2&t=8860 and #445.

Location:
trunk/eraser
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/eraser

  • trunk/eraser/Eraser.DefaultPlugins/FileSystems/Fat.cs

    r2516 r2732  
    7575        { 
    7676            using (FileStream stream = info.Open(FileAccess.ReadWrite, FileShare.ReadWrite)) 
     77            using (FatApi api = GetFatApi(info, stream)) 
    7778            { 
    7879                int directoriesCleaned = 0; 
    79                 FatApi api = GetFatApi(info, stream); 
    8080                HashSet<uint> eraseQueueClusters = new HashSet<uint>(); 
    8181                List<FatDirectoryEntry> eraseQueue = new List<FatDirectoryEntry>(); 
    82                 { 
    83                     FatDirectoryEntry entry = api.LoadDirectory(string.Empty); 
    84                     eraseQueue.Add(entry); 
    85                     eraseQueueClusters.Add(entry.Cluster); 
    86                 } 
    8782 
    8883                try 
    8984                { 
     85                    { 
     86                        FatDirectoryEntry entry = api.LoadDirectory(string.Empty); 
     87                        eraseQueue.Add(entry); 
     88                        eraseQueueClusters.Add(entry.Cluster); 
     89                    } 
     90 
    9091                    while (eraseQueue.Count != 0) 
    9192                    { 
     
    9495 
    9596                        FatDirectoryBase currentDir = api.LoadDirectory(eraseQueue[0].FullName); 
     97                        eraseQueue[0].Dispose(); 
    9698                        eraseQueue.RemoveAt(0); 
    9799 
     
    118120                        "the volume is currently in use.")); 
    119121                } 
     122                finally 
     123                { 
     124                    foreach (FatDirectoryEntry entry in eraseQueue) 
     125                        entry.Dispose(); 
     126                } 
    120127            } 
    121128        } 
  • trunk/eraser/Eraser.Util.Native/Fat12Or16Api.cpp

    r2516 r2732  
    4040        if (info->VolumeFormat != L"FAT12" && info->VolumeFormat != "FAT16") 
    4141            throw gcnew ArgumentException(S::_(L"The volume provided is not a FAT12 or FAT16 volume.")); 
     42    } 
     43 
     44    Fat12Or16Api::!Fat12Or16Api() 
     45    { 
     46        if (Fat != NULL) 
     47        { 
     48            delete[] Fat; 
     49            Fat = NULL; 
     50        } 
    4251    } 
    4352 
     
    126135    } 
    127136 
     137    Fat12Or16Api::RootDirectory::!RootDirectory() 
     138    { 
     139        if (Directory != NULL) 
     140        { 
     141            delete[] Directory; 
     142            Directory = NULL; 
     143            DirectorySize = 0; 
     144        } 
     145    } 
     146 
    128147    void Fat12Or16Api::RootDirectory::ReadDirectory() 
    129148    { 
  • trunk/eraser/Eraser.Util.Native/Fat32Api.cpp

    r2516 r2732  
    4040        if (info->VolumeFormat != L"FAT32") 
    4141            throw gcnew ArgumentException(S::_(L"The volume provided is not a FAT32 volume.")); 
     42    } 
     43 
     44    Fat32Api::!Fat32Api() 
     45    { 
     46        if (Fat != NULL) 
     47        { 
     48            delete[] Fat; 
     49            Fat = NULL; 
     50        } 
    4251    } 
    4352 
  • trunk/eraser/Eraser.Util.Native/FatApi.cpp

    r2516 r2732  
    7070    } 
    7171 
     72    FatApi::!FatApi() 
     73    { 
     74        if (BootSector != NULL) 
     75        { 
     76            delete BootSector; 
     77            BootSector = NULL; 
     78        } 
     79    } 
     80 
    7281    FatDirectoryBase^ FatApi::LoadDirectory(String^ directory) 
    7382    { 
     
    344353    } 
    345354 
     355    FatDirectory::!FatDirectory() 
     356    { 
     357        if (Directory != NULL) 
     358        { 
     359            delete[] Directory; 
     360            Directory = NULL; 
     361            DirectorySize = 0; 
     362        } 
     363    } 
     364 
    346365    void FatDirectory::ReadDirectory() 
    347366    { 
  • trunk/eraser/Eraser.Util.Native/FatApi.h

    r2516 r2732  
    5151        FatApi(IO::Stream^ stream); 
    5252 
     53        /// Destructor. 
     54        virtual ~FatApi() { this->!FatApi(); } 
     55 
     56        /// Finalizer. 
     57        !FatApi(); 
     58 
    5359    public: 
    5460        /// <summary> 
     
    175181    public ref class FatDirectoryEntry 
    176182    { 
     183    public: 
     184        virtual ~FatDirectoryEntry() {} 
     185 
    177186    public: 
    178187        /// <summary> 
     
    257266        FatDirectoryBase(String^ name, FatDirectoryBase^ parent, unsigned cluster); 
    258267 
     268        virtual ~FatDirectoryBase() {} 
     269 
    259270    public: 
    260271        /// <summary> 
     
    345356        FatDirectory(String^ name, FatDirectoryBase^ parent, unsigned cluster, FatApi^ api); 
    346357 
     358        /// Destructor. 
     359        virtual ~FatDirectory() { this->!FatDirectory(); } 
     360 
     361        /// Finalizer. 
     362        !FatDirectory(); 
     363 
    347364        virtual void ReadDirectory() override; 
    348365        virtual void WriteDirectory() override; 
     
    357374        Fat12Or16Api(VolumeInfo^ info); 
    358375        Fat12Or16Api(VolumeInfo^ info, IO::Stream^ stream); 
     376 
     377        virtual ~Fat12Or16Api() { this->!Fat12Or16Api(); } 
     378        !Fat12Or16Api(); 
    359379 
    360380    public: 
     
    372392        public: 
    373393            RootDirectory(Fat12Or16Api^ api); 
     394 
     395            virtual ~RootDirectory() { this->!RootDirectory(); } 
     396            !RootDirectory(); 
    374397 
    375398        protected: 
     
    430453        Fat32Api(VolumeInfo^ info); 
    431454        Fat32Api(VolumeInfo^ info, IO::Stream^ stream); 
     455 
     456        virtual ~Fat32Api() { this->!Fat32Api(); } 
     457        !Fat32Api(); 
    432458 
    433459    public: 
Note: See TracChangeset for help on using the changeset viewer.