Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> это утечка? проверьте пожалуйста 
V
    Опции темы
boolean34
Дата 19.6.2012, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 1.11.2011

Репутация: нет
Всего: нет



Привет всем! Посмотрите код:
пишу в билдере
в заголовочном файле описываю класс и его методы:

Код

class Estim{
private:
void test(Estim &p)
void forecast(Estim &p)
public:
Estim(float a,float b){
...}//konstruktor
float ax,ay;
int N,K;
vector <float> trace
}
vector < vector<Estim*> > preliminary;// vektor ukazatelei na eksemplary klasa


Далее в *.cpp файле по ходу программы динамически создаю экземпляры:

preliminary[current].push_back(new Trajectory(...));

Когда объект перестает быть нужным удаляю :

Код

delete preliminary[current_sector][i]; // освободили память, отведенную под траекторию
preliminary[current_sector][i]=0; //занулили указатель


Теперь проблема:
при ситуации когда создается значительное число экземпляров класса , программа начинает тормозить(хотя в диспетчере задач как было выделено ресурсов программе так и остается)

подозрения:
корректно так удалять и освободиться ли при этом память?
в векторе  trace десятки чисел; при удалении экземпляра класса, память отведенная под вектор тоже освободиться?

Добавлено @ 08:38
или надо описать деструктор?

Это сообщение отредактировал(а) Alexeis - 19.6.2012, 08:48
PM MAIL   Вверх
Alexeis
Дата 19.6.2012, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



boolean34, если для каждого new был вызван delete, то утечек нет. Другое дело, что каждый вектор резервирует память про запас и не уничтожает ее оставляя для будущих операций. Также поступает вектор векторов. Уменьшить память можно только создав новый вектор векторов, скопировать туда содержимое 1го и уничтожив 1й. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
boolean34
Дата 19.6.2012, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 1.11.2011

Репутация: нет
Всего: нет



т.е перед удалением объекта, я должен методом swap() обменять содержимое obj->trace на пустой вектор temp и потом только удалять?
PM MAIL   Вверх
borisbn
Дата 19.6.2012, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(boolean34 @  19.6.2012,  08:33 Найти цитируемый пост)
preliminary[current].push_back(new Trajectory(...));

push_back-то ты сделал, и дажу удалил delete'ом выделенную память, а в векторе остался пустой указатель. Нужно делать vector::erase удалённого элемента



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boolean34
Дата 19.6.2012, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 1.11.2011

Репутация: нет
Всего: нет



да-да я удаляю. вот так:
stab[current_sector].erase(std::remove(stab[current_sector].begin(), stab[current_sector].end(), static_cast<Estim*>(0)), stab[current_sector].end());

PM MAIL   Вверх
Alexeis
Дата 19.6.2012, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(borisbn @  19.6.2012,  10:31 Найти цитируемый пост)
push_back-то ты сделал, и дажу удалил delete'ом выделенную память, а в векторе остался пустой указатель. Нужно делать vector::erase удалённого элемента

  Только в случае если элементы удаляются по одному. Если же разом все, то можно очищать clear() .

Цитата(boolean34 @  19.6.2012,  09:57 Найти цитируемый пост)
т.е перед удалением объекта, я должен методом swap() обменять содержимое obj->trace на пустой вектор temp и потом только удалять?

  Как вариант. Но это нужно делать не с точки зрения правильности, а с точки зрения экономии памяти. На самом деле такая экономия памяти приведет к потере производительности при последующем использовании объекта в виде новых перераспределений памяти на push_back . 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
boolean34
Дата 19.6.2012, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 1.11.2011

Репутация: нет
Всего: нет



хорошо , всем спасибо! оказывается ошибка закралась в логическую организацию программы
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0541 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.