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

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

08.05.2015, 18:28. Показов 7236. Ответов 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
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
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
Ответ Создать тему
Новые блоги и статьи
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru