Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/30: Рейтинг темы: голосов - 30, средняя оценка - 4.83
17 / 17 / 5
Регистрация: 19.09.2012
Сообщений: 216

Как освободить память после удаления объекта из вектора

08.05.2015, 18:28. Показов 7212. Ответов 68
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток. Никак не могу понять как освободить память, после удаления объекта из вектора...
C++
1
2
3
std::vector<TNetwork*> networks;
//конструктор
this->networks.push_back(new TNetwork(typeNetwork, name));
в TNetwork тем же макаром создаются другие динамические объекты
уже как только не пытался удалить элемент из networks, но память все равно не освобождается...
C++
1
2
3
    delete this->networks[deleteNo];
    this->networks.erase(this->networks.begin() + deleteNo);
    std::vector<TNetwork*>(networks).swap(networks);
Подскажите плиз, что я делаю не так Может примерчик какой или мой поправить
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.05.2015, 18:28
Ответы с готовыми решениями:

Как освободить память из-под вектора объектов?
vector&lt;TObj*&gt; obj; obj.push_back(new obj()); obj.erase(obj.begin()+indx);//удаляю указатель который указывал на объект &quot;Для...

Как освободить память после использования SQLite?
Как освободить память после использование sqlite? SQLiteDatabase := TSQLiteDatabase.Create(datadir); SQLiteTable :=...

Как освободить память после закрытия формы
Использую на событии OnClose данный код Action := caFree; Но мне нужно, чтобы можно было повторно открыть форму, стояло form1.show; но...

68
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
08.05.2015, 22:58
Студворк — интернет-сервис помощи студентам
Fobes,
nmcf Вам во втором сообщение привёл рабочий вариант. Ищите что не удаляется )

И зная теперь вашу задачу, тоже всеми руками за уход от указателей. В нейросетях они концептуально не требуются, а вот быстродействие очень даже нужно, ибо я помню как обучал 6 часов сеть с <1000 нейронов на все слои
0
Мой лучший друг-отладчик!
 Аватар для ZaMaZaN4iK
167 / 167 / 30
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
08.05.2015, 22:58
Я может чего-то не понимаю? У нас есть вектор каких-то обьектов. Мы просто с помощью erase() удаляем любой обьект. А потом делаем shrink_to_fit(). И он освободит всю память.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
08.05.2015, 23:00
Цитата Сообщение от nmcf Посмотреть сообщение
Я имел в виду, что правильнее хранить объект, потому что при удалении его из вектора он уничтожится автоматически через деструктор.
совершенно верная мысль.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,822
08.05.2015, 23:02
Цитата Сообщение от Fobes Посмотреть сообщение
получил полтора гига оперативы в диспетчере
Диспетчер - это не показатель.
Цитата Сообщение от Fobes Посмотреть сообщение
удалил сеть, в диспетчере ничего не поменялось)
Это нормально.
Цитата Сообщение от Fobes Посмотреть сообщение
создал еще одну такую ще, получил что оперативка кончилась )
Тут поподробнее, std::bad_alloc прилетел?
1
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
08.05.2015, 23:05
Fobes, А вообще я тут прикинул про 1.5 гб оперативы для нейросети и совсем не понимаю как вы так смогли
У вас там наверняка что-то лишнее, ибо по моим прикидкам выходит что у вас 800 слоёв по 10000 нейронов
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
08.05.2015, 23:25
Цитата Сообщение от ZaMaZaN4iK Посмотреть сообщение
У нас есть вектор каких-то объектов. Мы просто с помощью erase() удаляем любой обьект.
Там просто указатели. Вектор удалит сам указатель и всё. Так же как числа.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
08.05.2015, 23:40
Цитата Сообщение от nmcf Посмотреть сообщение
тем более копирование вектора, которое потребует вызывать выделение памяти под каждый элемент?
Память же выделяется под указатели и делается это автоматически? А под объекты зачем? Другое дело, что если требуется такое копирование то нужно уже отслеживать кто владелец, иначе не освободить потом правильно.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
08.05.2015, 23:46
TNetwork в этом типе в деструкторе брейк поинт и посмотри удаляется ли!

Как вариант у тебя десктруктор не виртуальный - или еще что
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
09.05.2015, 00:14
rikimaru2013, судя по коду, полиморфное поведение не требуется, т.к. статический и динамический типы совпадают. Хотя, кто знает что там еще понаписано и нам не показано.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
09.05.2015, 08:34
Цитата Сообщение от IGPIGP Посмотреть сообщение
А под объекты зачем?
Тогда копировать зачем? Одной копии указателей хватит.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
09.05.2015, 08:46
Цитата Сообщение от nmcf Посмотреть сообщение
Тогда копировать зачем? Одной копии указателей хватит.
Так про копию же Вы начали. Привычка работать с глубокой копией, это не путь к победе если речь о больших массивах крупных объектов.
К вопросу ТС это относится косвенно. Работа с низкоупровневым указателем, это вещь нервная. Тут все правы.
Особенно плохо, когда типы содержат указатели. Необязательно рекурсивно (это вообще класс), а просто ограниченные цепи. Тогда, при ошибочно написанных деструкторах утечка при удалении неизбежна. А это имеет прямое отношение к теме. И пока нет конкретного кода ничего нельзя сказать о том, как оно и к чему относится. Есть предположение о преждевременной оптимизации. Разобраться с деструкторами и динамической памятью надо раньше чем осваивать нейронные сети огромного размера. Но это тоже предположение. Нужен код. И главный вопрос, - кому он нужен больше.

Не по теме:

Всех поздравляю с Праздником!

1
17 / 17 / 5
Регистрация: 19.09.2012
Сообщений: 216
09.05.2015, 11:51  [ТС]
Nosey, ну я образно же сказал полтора миллиона во входном и 1234 в выходном, скрытых нет... получил переполнение
DrOffset, получил "External exception EEFFACE"
nmcf, IGPIGP,
менеджер сетей, в нем пытаюсь удалять:
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
//.h----------------------
class TNetworkManager{
    public:
        void createNetwork(TYPE_NETWORK typeNetwork,const UnicodeString &name);
        void deleteNetwork(unsigned int deleteNo);
 
    private:
        std::vector<TNetwork*> networks;
};
//.cpp-----------------------
//создает пустую сеть
void TNetworkManager::createNetwork(TYPE_NETWORK typeNetwork, const UnicodeString &name)
{
    this->networks.push_back(new TNetwork(typeNetwork, name));
}
 
//удаляет выбранную сеть
void TNetworkManager::deleteNetwork(unsigned int deleteNo)
{
    delete this->networks[deleteNo];
    this->networks.erase(this->networks.begin() + deleteNo);
    std::vector<TNetwork*>(networks).swap(networks);
}
 
};
класс сети:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//.h
class TNetwork{
    public:
 
        TNetwork(TYPE_NETWORK typeNetwork, UnicodeString name);
 
        void createLayers(  std::vector<UnicodeString> layersNames,
                            std::vector<unsigned int> layerNeurons);
 
    private:
        std::vector<TLayer*> layers;
 
};
//.cpp
TNetwork::TNetwork(TYPE_NETWORK typeNetwork, UnicodeString name)
{
    this->type = typeNetwork;
    this->name = name;
}
 
//создаем слои для сети
//layersNames - имена каждого из слоев
//layersNeurons - число нейронов с слое
//beforeLayersNeurons - число нейронов в предыдущем слое( для числа входов нейрона)
void TNetwork::createLayers(std::vector<UnicodeString> layersNames,
    std::vector<unsigned int> layerNeurons)
{
    //чистим предыдущие варианты
    layers.clear();
    //создаем все слои
    int j = 0;
    for (unsigned int i = 0; i < layersNames.size(); i++)
    {
        if (i == 0)
        {
            layers.push_back(new TLayer(layersNames[i], layerNeurons[i], 1, 0));
        }
        else
        {
            layers.push_back(new TLayer(layersNames[i], layerNeurons[i], layerNeurons[j],1));
            j++;
        }
 
    }
}
класс слоя:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
class TLayer{
    public:
        UnicodeString name;
        unsigned int nNeurons;
 
        TLayer( UnicodeString layerName,
                unsigned int layerNeuron,
                unsigned int inputsOnNeuron,
                unsigned int layerNo);
 
 
        void createNeurons( unsigned int layerNeuron,
                            unsigned int inputsOnNeuron,
                            unsigned int layerNo);
 
        std::vector<TNeuron*> neurons;
 
    private:
 
 
};
 
//layerName - имя слоя
//layerNeuron - нейронов в слое
//inputsOnNeuron - входов на нейрон
//layerNo - номер слоя в хотором сидит нейрон
TLayer::TLayer( UnicodeString layerName,
                unsigned int layerNeuron, unsigned int inputsOnNeuron, unsigned int layerNo)
{
    this->name = layerName;
    this->nNeurons = layerNeuron;
 
    createNeurons(layerNeuron, inputsOnNeuron, layerNo);
}
 
 
//layerNeuron - число нейронов в слое
//inputsOnNeuron - входов в нейроне
//layerNo - номер слоя в хотором сидит нейрон
void TLayer::createNeurons(unsigned int layerNeuron, unsigned int inputsOnNeuron, unsigned int layerNo)
{
    for (unsigned int i = 0; i < layerNeuron; i++)
    {
        neurons.push_back(new TNeuron(inputsOnNeuron, layerNo));
    }
}
входы и веса нейронов инициализирую без указателей
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class TNeuron{
    public:
        TNeuron(unsigned int nInputs, unsigned int layerNo);
 
        NEURON_TERM term;
 
        std::vector<float> inputs;      //входы найронов
        std::vector<float> weights;     //веса входов
 
    private:
 
 
};
Для чего же тогда ссылки и указатели нужны ?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
09.05.2015, 11:56
Fobes, У вас указатели Tlayer указывают на указатели на нейроны. Проследите везде где выделяется память, чтобы в соответствующих деструкторах было её освобождение. Указатель в ноль сбрасывайте и даже перед выделением сначала в ноль устанавливайте (имхо). Удобно проверять перед удалением.
1
17 / 17 / 5
Регистрация: 19.09.2012
Сообщений: 216
09.05.2015, 11:59  [ТС]
IGPIGP, сразу вопрос, как правильно писать деструктор ? Ибо когда я создавал скажем ~Tlayer то получал удаление элементов после выполнения... Как сделать вызов деструктора по необходимости ?
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
09.05.2015, 12:02
Fobes,
1) Вы не удаляете слои в TNetwork::createLayers
2) В TLayer нет деструктора. -> вы не удаляете нейроны.
1
17 / 17 / 5
Регистрация: 19.09.2012
Сообщений: 216
09.05.2015, 12:21  [ТС]
Вот я дурень ^_^
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
TNetwork::~TNetwork()
{
    for(unsigned int i = 0; i < layers.size(); i++)
    {
        delete layers[i];
    }
}
 
TLayer::~TLayer()
{
    for (unsigned int i = 0; i < neurons.size(); i++)
    {
        delete neurons[i];
    }
}
Все работает нормально теперь ^_^

Добавлено через 6 минут
Может дабы не создавать новую тему объясните в каких случаях лучше использовать ссылку, в каких указатель, а в каких просто объект статический ?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
09.05.2015, 12:28
Цитата Сообщение от Fobes Посмотреть сообщение
Как сделать вызов деструктора по необходимости
Деструкторы вызываются автоматически при выходе из области и при вызове delete (вызывается деструктор для объекта на который показывал покойник), []delete(для всех в массиве).
Острота в том, что если Вы сами не позаботитесь о вызове delete/ []delete для вложенных указателей (на дин. память), и о их, в свою очередь, деструкторах, то это и не произойдёт.

Добавлено через 2 минуты
Цитата Сообщение от Fobes Посмотреть сообщение
каких просто объект статический
Если не будете выходить из области (с данным контейнером, передавать его то есть), то это лучший выбор. Массивы ссылок создать нельзя, поэтому остаются указатели. Литература об этом не умалчивает.
1
 Аватар для SmittWesson
236 / 196 / 21
Регистрация: 04.06.2014
Сообщений: 1,309
09.05.2015, 12:28
Ребятааа. Не первый раз вижу бред на этом форуме. STL, читайте по-внимательнее. Деструктор, автоматически освобождает память. Это сделано для того, что-бы мы больше на этот счёт не парились в отличии от malloc, calloc и прочих малок .
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
09.05.2015, 12:31
Цитата Сообщение от SmittWesson Посмотреть сообщение
Не первый раз вижу бред на этом форуме. STL, читайте по-внимательнее. Деструктор, автоматически освобождает память.
В том случае если в нём это записано. Почитайте ещё раз.
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
09.05.2015, 12:39
Только не статика прошу вас
Статика это потенциальный огромный геморой в крупном проекте.
Для прототипирования, когда вы не знаете какэто написать - сойдёт, но в конечном счёте ничего хорошего статика не принесёт
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.05.2015, 12:39
Помогаю со студенческими работами здесь

Как освободить память (ресурс) после его использования
private void installButton_MouseEnter(object sender, EventArgs e) { installButton.Image =...

Освободить память вектора векторов без swap
Собственно будет ли &quot;Swap-To-Fit&quot; std::vector&lt;std::vector&lt;double&gt;&gt; m_coefficients; . . . ...

Как освободить старые ImageVew чтобы освободить память
Привет всем Я новичок поэтому прошу сильно не пинать. В общем мое первое приложение типа интернет магазин. Одно окно в котором...

Как правильно освободить память после работы с динамическим массивом
Здравствуйте! Помогите понять в чём проблема при освобождении памяти. Простой пример: #define _CRT_SECURE_NO_WARNINGS #include...

Освободить оперативную память, после удаление формы
Помогите. Создаю форму так: Form1 notific = new Form1(); notific.Visible = true; Уничтожаю так: ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru