2 / 2 / 4
Регистрация: 28.06.2013
Сообщений: 56
1

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

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

Author24 — интернет-сервис помощи студентам
Похоже что проблема с освобождением памяти.
У меня есть абстрактный класс 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();
 
    }
...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.05.2014, 23:32
Ответы с готовыми решениями:

Резервирование памяти/освобождение памяти для трехмерного массива
Необходимо создать трехмерный массив (A), в котором элементы вдоль направления Z выли бы выровнены...

Освобождение памяти
Маленький вопросик, как правильно освобождать память выделенную под vector&lt;...&gt;, деструктором...

с++ Освобождение памяти
Здравствуйте, объявляю в классе: А ** а; Далее выделяю память в функции: а=0; a = new A*;...

Освобождение памяти
Есть класс дроби с перегруженным оператором приведения к char * Fraction::operator char*() { ...

2
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
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 из вектора удаляется элемент. Но Этот элемент сам является указателем, и его тоже нужно удалить как следует.
1
2 / 2 / 4
Регистрация: 28.06.2013
Сообщений: 56
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;
    }
0
27.05.2014, 07:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.05.2014, 07:41
Помогаю со студенческими работами здесь

Освобождение памяти
#include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; int main() { int i, k; float SO, S,...

Освобождение памяти
Есть класс, в котором я выделяю память с помощью new. В деструкторе класса я с помощью delete...

Освобождение памяти
Товарищи,недавно баловался в Microsoft VS,готовился к экзаменам,писал небольшие програмки с...

освобождение памяти
Помогите найти ошибку, программа вилиться когда освобождаю память! Здесь выделения памяти double...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru