17 / 17 / 5
Регистрация: 19.09.2012
Сообщений: 216

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

08.05.2015, 18:28. Показов 7289. Ответов 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
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru