Форум программистов, компьютерный форум CyberForum.ru

Работа с памятью - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
red_88
6 / 6 / 0
Регистрация: 10.02.2009
Сообщений: 136
28.10.2010, 16:08     Работа с памятью #1
Всем доброго времени суток. Почитав данный форум и проч. пришёл к выводу, что мой проект на C# нереален в виду бестолковой работы с памятью. В общем задача такова. Есть класс:
C++
1
2
3
4
5
6
7
8
9
10
11
12
class oAlternativa
{
public:
    oAlternativa(void);
    oAlternativa(int *init,int count);
    virtual ~oAlternativa(void);
    int *Ves;
    int nSize;
    int nFrom;
    int nTo;
    int ID;
};
сейчас в диструкторе написано:
C++
1
2
3
4
oAlternativa::~oAlternativa(void)
{
    if (!Ves==NULL) delete(Ves);
}
Верно ли это и достаточно ли?
Есть ещё один класс:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#pragma once
#include <list>
#include <iostream>
#include <fstream>
using namespace std;
#include "oAlternativa.h"
 
class oUzel
{
private:
    list<oAlternativa> BestWays;
public:
    oUzel(void);
    ~oUzel(void);
    list<oAlternativa> Sources;
    list<oAlternativa> Dests;
    int AddWay(oAlternativa Way);//Добавление к набору BestWays одного из элементов
    int DelWay(int WayID);//Удаление из набора BestWays элемента(ов) у которых ID=WayID
};
Про добавление к набору вопросв нет, а вот как реализовать удаление из набора чтобы память очистить от того, что не нужно? Заранее всем спасибо за ответ.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2010, 16:08     Работа с памятью
Посмотрите здесь:

работа с памятью C++
Работа с памятью C++
C++ Работа с памятью
C++ работа с памятью
C++ Работа с памятью
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
28.10.2010, 16:12     Работа с памятью #2
red_88, У списка впринципе свой сборщик...
C++
1
2
3
4
oAlternativa::~oAlternativa(void)
{
        if (Ves==0) delete(Ves);
}
Но все зависит от того простой указатель это или же массив... Т.е. идет ли под него выделение памяти под N элементов
Sudoki
124 / 64 / 1
Регистрация: 19.04.2010
Сообщений: 196
28.10.2010, 16:16     Работа с памятью #3
речь шла про удаление из набора.
Я не силен в STL но что то смутно помню надо пользоваться функциями find чтобы найти все значения удовлетворяющие какому то критерию. Затем удалить их из списка.
red_88
6 / 6 / 0
Регистрация: 10.02.2009
Сообщений: 136
28.10.2010, 16:20  [ТС]     Работа с памятью #4
Да, речь идёт о динамическом массиве. Причем его величина не очень велика (до 10), но вот количество объектов oAlternativa скорее всего перевалит за 9 000 000 000.
Sudoki
124 / 64 / 1
Регистрация: 19.04.2010
Сообщений: 196
28.10.2010, 16:27     Работа с памятью #5
Это при малом 8Гб информации.
red_88
6 / 6 / 0
Регистрация: 10.02.2009
Сообщений: 136
29.10.2010, 17:20  [ТС]     Работа с памятью #6
8 Гб оперативки в наличии
Главное чтобы сильно не свопило

Добавлено через 2 часа 3 минуты
Может кто-нибудь подсказать по второму вопросу? Про удаление массива проще,а вот как list'ом пользоваться, для меня тёмный лес после фреймворка.

Добавлено через 22 часа 20 минут
Неужели никто list'ом не пользовался?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
29.10.2010, 17:57     Работа с памятью #7
red_88, Список
Конкретно нужно мне кажется вот это:
Remove_if для списка
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2010, 14:49     Работа с памятью
Еще ссылки по теме:

C++ Работа с памятью в С++
C++ Работа с памятью
Работа с памятью C++

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

Или воспользуйтесь поиском по форуму:
red_88
6 / 6 / 0
Регистрация: 10.02.2009
Сообщений: 136
30.10.2010, 14:49  [ТС]     Работа с памятью #8
Lavroff, а remove_if удаляет только ссылку на объект в листе или сам объект из памяти тоже? Дело в том, что количество удалений будет много больше размерности задачи и если удаляются только ссылки то памяти понадобится ого-го

Добавлено через 1 минуту
что-то должно быть с грамотным вызовом erase, в этом у меня главная проблема

Добавлено через 15 часов 25 минут
Написал таким образом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#pragma once
#include <list>
using namespace std;
#include "oAlternativa.h"
 
class oUzel
{
public:
    oUzel(void);
    oUzel(int n);
    ~oUzel(void);
    list<oAlternativa> BestWays;
    int num;
    list<oAlternativa> Sources;
    list<oAlternativa> Dests;
    int TryAdd(oUzel Source,oAlternativa way);
    bool del_marck (const oAlternativa& value) { return (value.nFrom==0); }
    int AddWay(oAlternativa Way)//Добавление к набору BestWays одного из элементов
        {   Way.nFrom=1;    BestWays.push_back(Way);    return 1;}
    int DelWay(oAlternativa Way)//Удаление из набора BestWays элемента
        {   Way.nFrom=0;    BestWays.remove_if(del_marck);  return 1;}
};
Но на строку с объявлением функции del_marck выдаёт следующую ругань:
Код
1>c:\users\user\documents\visual studio 2010\projects\mdp\mdp\ouzel.h(21): error C3867: oUzel::del_marck: в вызове функции отсутствует список аргументов; используйте "&oUzel::del_marck" для создания указателя на член
Я так понимаю, функцию надо было объявлять либо вне класса либо как то указать, что поиск ведётся именно по листу BestWays?
Yandex
Объявления
30.10.2010, 14:49     Работа с памятью
Ответ Создать тему
Опции темы

Текущее время: 01:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru