Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > правильно освободить память


Автор: Incinerated 15.12.2010, 14:02
Проект c++/cli
есть класс:
Код

[Serializable]
public ref class sFile
{
public:
private:    
    String^ m_extension;
    String^ m_place;
    String^ m_name;
public:
    sFile(String^ place, String^ name, String^ ext);
};

[Serializable]
public ref class sDir
{
private:
    List<sFile^> ^m_files;
    List<sDir^> ^m_dirs;
    String^ m_place;
    String^ m_name;
public:
    sDir(String^ place, String^ name);
};

[Serializable]
public ref class sDrive
{
private:
    List<sFile^> ^m_files;
    List<sDir^> ^m_dirs;
    String^ m_name;
public:    
    sDrive(String^ name);
};

public ref class MySearch 
{
private:
    List<sDrive^> ^drives;
public:    
    MySearch(String^ pathToDb);
    ~MySearch();
};

т.е. у меня где то по коду создается экземпляр gcnew MySearch, дальше по коду создается gcnew List<sDrive^> и так далее, создается куча объектов, а в этих объектах создаются gcnew String, так вот, в конце работы программы, выделенной памяти получается под 300 Mb, я рекурсивно вроде освобождаю память в деструкторе MySearch, но что то ничего не освобождается.... как было 300 Mb, так и остается. Вот как я удаляю:
Код

void MySearch::FreeAllMemory(List<sDir^> ^Dirs)
{    
    List<sDir^>::Enumerator ^it_dir = Dirs->GetEnumerator();
    while (it_dir->MoveNext())
    {
        if (it_dir->Current->GetFiles())
            delete[] it_dir->Current->GetFiles();
        if (it_dir->Current->GetDirs()->Count > 0){
            FreeAllMemory(it_dir->Current->GetDirs());
            delete[] it_dir->Current->GetDirs();
        }
    }
}

    

MySearch::~MySearch()
{
    List<sDrive^>::Enumerator ^it_drive = drives->GetEnumerator();
    while (it_drive->MoveNext())
    {        
        if (it_drive->Current->GetFiles())
            delete[] it_drive->Current->GetFiles();
        if (it_drive->Current->GetDirs()){
            FreeAllMemory(it_drive->Current->GetDirs());
            delete[] it_drive->Current->GetDirs();
        }

    }    
    delete[] drives;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)