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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Allpodo
0 / 0 / 0
Регистрация: 14.08.2011
Сообщений: 54
#1

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

07.04.2012, 23:48. Просмотров 474. Ответов 5
Метки нет (Все метки)

это у меня находится в классе 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;
    }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.04.2012, 23:48     Не освобождается память при выбросе исключений
Посмотрите здесь:

Не освобождается память - C++
Мне надо сделать прогу,точнее переделать, с использованием динамического двумерного массива... Я не буду писать эту прогу в изночальном...

Освобождается ли память? - C++
Под вводимое с клавиатуры количество переменных выделяется память. Затем переменным в цикле присваивается значение. int units, *x; ...

Память освобождается не полностью - C++
Суть такова. При многократном выделении/освобождении растет (судя по диспетчеру задач Шindows) используемая программой память. Например,...

Почему память массива не освобождается? - C++
В выводе *b должна быть ересь, но на самом деле коректно выводит цифру &quot;3&quot;. #include &lt;iostream&gt; using namespace std; void func(int...

Память освобождается, но значение остается - C++
Почему в следующем коде, программа завершается принудительно, но в консоли все равно видно значение переменной, память которой была...

Правильно ли в данной программе освобождается память? - C++
Доброго времени суток, написал учебную программу из книги Праты. В принципе задание не требует всего этого, но решил понабить руку и...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryLaptev
Эксперт С++
1039 / 818 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
07.04.2012, 23:51     Не освобождается память при выбросе исключений #2
Дык прежде, чем генерить исключение - освободи память.
Для динамического объекта деструктор вызывается при вызове delete.
А при генерации исключения - нет.
Allpodo
0 / 0 / 0
Регистрация: 14.08.2011
Сообщений: 54
07.04.2012, 23:51  [ТС]     Не освобождается память при выбросе исключений #3
Тогда при каждом использовании поиска у меня будет освобождаться память, разве нет ?


сам класс с исключением менять нельзя.
ValeryLaptev
Эксперт С++
1039 / 818 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
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" );
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.04.2012, 00:16     Не освобождается память при выбросе исключений
Еще ссылки по теме:

Не освобождается память в списке указателей на класс - C++
#include &lt;iostream&gt; #include &lt;list&gt; using namespace std; class myClass{ private: int x; bool life; public: ...

Нехватка памяти при выбросе исключения - C++
Собственно, наткнулся на проблему //Если здесь для создания std::string не хватит памяти, то вылетит std::bad_alloc, вместо...

Обработка исключений при работе с файлами - C++
Кто может помочь с обработкой исключений для файла? Нужно чтобы обработчик перехватывал исключение и предлагал ввести путь к файлу заново....

Возникает ошибки при обработке исключений. - C++
MicrosoftDeveloperStudio. У меня есть try блок, в котором возникает ошибка. Catch(CException ex) это исключение не ловит. Ловит только...

Обработка исключений при вводе некорректных данных - C++
День добрый, начал разбираться с исключениями, пока не совсем понимаю в чем их удобство и зачем они нужны, какие преимущества и т.д... но...

Обработку исключений при вводе некорректных данных - C++
#include &lt;iostream&gt; #include &lt;signal.h&gt; using namespace std; class Student{public: string Status,Speciality,Name,LName; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
DU
1482 / 1058 / 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     Не освобождается память при выбросе исключений
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru