Форум программистов, компьютерный форум CyberForum.ru

Не освобождается память при выбросе исключений - C++

Восстановить пароль Регистрация
 
Allpodo
0 / 0 / 0
Регистрация: 14.08.2011
Сообщений: 54
07.04.2012, 23:48     Не освобождается память при выбросе исключений #1
это у меня находится в классе Add. Туда я добавляю элементы, перед этим проверяю, нет ли такого уже:

C++
1
2
3
4
5
6
7
8
9
    try
    {
        tempDriver= &(FindDriver(name, surname)); // ищем водилу, если найден - будет адрес записан, если нет - исключение.
        const_cast<CDriver*>(tempDriver)->weSearchSomething=false;
    }
 
    catch(InvalidDriverException& drive)
    {
    }
тут я ищу автомобиль в массиве, если не нахожу, то выбрасываю исключение:

C++
1
2
3
4
5
6
7
8
9
10
const CCar& CDatabase:: FindCar (const string& RZ ) const
{
    for(int i=0;i<m_CarsNr;i++)
     if(*(m_Cars[i]) == RZ) // у нас указатель на указатель
     {
         m_Cars[i]->weSearchSomething=true;
         return *m_Cars[i];
     }
    throw InvalidCarException(RZ);
}
исключение должно быть в виде класса:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class InvalidDriverException
 {
   public:
      InvalidDriverException ( const string& name, const string& surname )
      :m_Name (name), m_Surname (surname) {}
 
    friend ostream& operator << ( ostream& os, const InvalidDriverException& e)
    {
         return os << e . m_Name << ' ' << e . m_Surname;
    }
 
   private:
    string m_Name;
    string m_Surname;
 };


Когда выбрасываю исключения не освобождается память. Как это исправить ?


Деструктор такого вида
C++
1
2
3
4
5
6
    ~CDriver()
    {
        for(int i=0;i<m_LogNr;i++)
         delete &m_Log[i];
        delete [] m_Log;
    }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
07.04.2012, 23:51     Не освобождается память при выбросе исключений #2
Дык прежде, чем генерить исключение - освободи память.
Для динамического объекта деструктор вызывается при вызове delete.
А при генерации исключения - нет.
Allpodo
0 / 0 / 0
Регистрация: 14.08.2011
Сообщений: 54
07.04.2012, 23:51  [ТС]     Не освобождается память при выбросе исключений #3
Тогда при каждом использовании поиска у меня будет освобождаться память, разве нет ?


сам класс с исключением менять нельзя.
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
07.04.2012, 23:55     Не освобождается память при выбросе исключений #4
В смысле - нужный водила не находится?
Тогда давай полную картину...
Allpodo
0 / 0 / 0
Регистрация: 14.08.2011
Сообщений: 54
08.04.2012, 00:08  [ТС]     Не освобождается память при выбросе исключений #5
есть 5 классов.
InvalidCarException
InvalidDriverException
CCar;
CDriver;
CDatabase

CCar - Содержит информацию о машине, номерной знак и структуру, где указано время, когда машину брали на прокат и указатель на водителя, который брал машину.
CDriver - Имя фамилия и структура, где указано время, когда человек брал машину на прокат и есть указатель внутри структуры на машину, которая бралась в это время.

Всё бы нормально, но если я ищу водителя или машину, которой нету в базе данных, должно выскочить исключение, но в этом случае у меня остаётся много блоков неосвобождённой памяти.

C++
1
2
3
4
5
6
7
8
9
10
    try
    {
        tempDriver= &(FindDriver(name, surname));
        const_cast<CDriver*>(tempDriver)->weSearchSomething=false;
    }
 
    catch(InvalidDriverException& drive)
    {
        //Здесь освобождаем память. Можно ? Если да, то круто. Но как ?)))
    }

C++
1
2
3
4
5
6
7
8
9
const CCar& CDatabase:: FindCar (const string& RZ ) const
{
   for(int i=0;i<m_CarsNr;i++)
     if(*(m_Cars[i]) == RZ) //
     {
//возвращаю автомобиль.
     }
    throw InvalidCarException(RZ);
}


С базами работаю так:
C++
1
2
3
4
5
6
7
8
a = new CDatabase;
    b = new CDatabase;
    st = a -> Add ( "2012-03-01", "John", "Nash", "ABC-12-34" ); // st = true
*b = *a;
    c = new CDatabase ( *a );
    st = b -> Add ( "2012-03-03", "Homer", "Simpson", "ABC-12-34" ); // st = true
    st = c -> Add ( "2012-03-03", "Homer", "Simpson", "DEF-56-67" ); // st = true
   cout << a -> FindCar ( "XYZ-99-88" );
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
08.04.2012, 00:16     Не освобождается память при выбросе исключений #6
C++
1
2
3
4
5
6
7
8
9
10
 try
    {
        tempDriver= &(FindDriver(name, surname));
        const_cast<CDriver*>(tempDriver)->weSearchSomething=false;
    }
 
    catch(InvalidDriverException& drive)
    {
        //Здесь освобождаем память. Можно ? Если да, то круто. Но как ?)))
    }
Если в блоке try было выделение памяти, то надо как-то освобождать. на первый взгляд не видно.
Ознакомтесь с идиомой RAII и смарт поинтерами в частности. Тогда такого рода проблем будет сильно меньше.
Yandex
Объявления
08.04.2012, 00:16     Не освобождается память при выбросе исключений
Ответ Создать тему
Опции темы

Текущее время: 05:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru