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

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

Войти
Регистрация
Восстановить пароль
 
Skaarj
2 / 2 / 1
Регистрация: 28.06.2013
Сообщений: 53
#1

Освобождение памяти - C++

26.05.2014, 23:32. Просмотров 309. Ответов 2
Метки нет (Все метки)

Похоже что проблема с освобождением памяти.
У меня есть абстрактный класс CObject и его потомок CMeteor, в котором реализованы виртуальные функции одна из которых уничтожение объекта через определенное количество времени. Объекты класса CMeteor создаются раз в определенное время и помещаются в контейнер Objects. Правильно ли я понимаю, что при каждом erase объекта из контейнера надо использовать delete? И всю ли память я отчищаю таким способом? Потому что я заметил(через диспетчер задач), что при достижение максимального количество объектов, память всё равно потихоньку уходит. Ровно раз в 20 тиков. При комментирование этого куска - всё нормально, в смысле память не уходит Заранее спасибо.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    
...
extern std::vector<CObject*> Objects;
CObject * pp = new CMeteor;
 
    if(tic > 20)                            // раз в 20 тиков создаём объект и помещаем в контейнер
    {
        pp->CreateObject(NULL);
        Objects.push_back(pp);
        tic= 0;
    }
    tic++;
    
    for(int l = 0; l < (int)Objects.size(); l++)        // проверяем если объект существует N тиков, то уничтожаем и чистим память
    {
        if(Objects[l]->RemoveObject() == true)
        {
            Objects.erase(Objects.begin() + l);
            delete pp;
        }
    }
 
    for(int l = 0; l < (int)Objects.size(); l++)        //прорисовка объекта
    {
        Objects[l]->DrawObject();
 
    }
...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.05.2014, 23:32     Освобождение памяти
Посмотрите здесь:

C++ Освобождение памяти
C++ Освобождение памяти
резервирование памяти/освобождение памяти для трехмерного массива C++
Освобождение памяти C++
C++ освобождение памяти
Проясните освобождение памяти C++
с++ Освобождение памяти C++
C++ Освобождение памяти
C++ Освобождение памяти в C++
C++ Освобождение памяти в c++
Освобождение памяти C++
C++ Освобождение памяти

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
monolit
182 / 182 / 21
Регистрация: 24.03.2011
Сообщений: 657
Завершенные тесты: 1
26.05.2014, 23:45     Освобождение памяти #2
Цитата Сообщение от Skaarj Посмотреть сообщение
И всю ли память я отчищаю таким способом
В данном случае что-нибудь у тебя, да удаляется. Почти наверняка совсем не то, что ты ожидал, но удаляется. Все потому, что у тебя pp при удалении также известен, в нем что-то лежит (он вроде указывает на последний элемент массива на данный момент) - поэтому такое прокатывает ('повезло' тебе). Я бы поступал следующим образом:
C++
1
2
3
4
5
6
7
8
for(int l = 0; l < Objects.size(); l++)        
    {
        if(Objects[l]->RemoveObject() == true)
        {
            delete Objects[l];
            Objects.erase(Objects.begin() + l);
        }
    }
так удалится действительно то, что ты ожидал.

Цитата Сообщение от Skaarj Посмотреть сообщение
Правильно ли я понимаю, что при каждом erase объекта из контейнера надо использовать delete
Правильно. В векторе у тебя хранится массив указателей. При вызове erase из вектора удаляется элемент. Но Этот элемент сам является указателем, и его тоже нужно удалить как следует.
Skaarj
2 / 2 / 1
Регистрация: 28.06.2013
Сообщений: 53
27.05.2014, 07:41  [ТС]     Освобождение памяти #3
Да, что то я действительно не догадался до такого очевидного решения. Не до конца осмыслил семантику контейнеров.

Утечка правда всё равно осталась, уж не знаю много это или нет - 4 кб/сек. Буду дальше разбираться. В старой версии, где я создавал объекты без виртуальной функции, а просто каждую заносил в отдельный контейнер тоже есть. Или у меня паранойя?

Добавлено через 1 час 48 минут
Проблема решилась, главное чуточку внимательнее быть ..и на свежую голову
C++
1
2
3
4
5
6
7
8
9
10
extern std::vector<CObject*> Objects;
 
 
    if(tic > 20)                            // раз в 20 тиков создаём объект и помещаем в контейнер
    {
        CObject * pp = new CMeteor;
        pp->CreateObject(NULL);
        Objects.push_back(pp);
        tic= 0;
    }
Yandex
Объявления
27.05.2014, 07:41     Освобождение памяти
Ответ Создать тему
Опции темы

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