55 / 56 / 34
Регистрация: 29.12.2012
Сообщений: 478
1

Корректное высвобождение памяти в list

01.06.2015, 21:43. Показов 2773. Ответов 52
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
У меня все нормально работает, ну и по логике тоже вроде нормально, но намучился с Коректным высвобождением памяти(ну пару раз упала программа,а может и больше).проверти нет ли утечки у меня...
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
list::list(int value)
 {
   myValue=value;
   myNext=0;
 }
 
void  list::push_back(int value)
 {
   list *arrant=this;     
                            
   while(arrant->myNext!=0)  
     {
       arrant=arrant->myNext;
     }
   arrant->myNext=new list(value);
 
 } 
 
list::~list()
 {
      delete myNext;
 }
 
void  list::pop_back()
{
    
    list * arrant=this;//На голову
    int counter=0;//счетчик чтобы остановится на предпоследним элементи
         while(counter<arrant->lentgh()) //arrant->lentgh()-функция длинны в этом случае была равна 5
     {
       arrant=arrant->myNext;
       ++counter;
     }
   list * carrant=arrant->myNext;//указателю адрес на последним элемент
   arrant->myNext=0;               //нулим указатель
   delete carrant;                      //высвобождаем память занимаемуе последним элемент
}
Добавлено через 2 минуты
ну если и поэлегантее способ сдесь есть то с удовольствием посмотрю...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.06.2015, 21:43
Ответы с готовыми решениями:

Долгое высвобождение памяти
Здравствуйте. Возможно, такой вопрос уже встречался, но ответа мне найти не удалось. Намахал...

Высвобождение динамической памяти
Нужна помощь, в проблеме высвобождения памяти, все делаю по стандартам С++, но постоянно выдает...

Высвобождение памяти статического массива
Возник такой вопрос - память из под статических массивов высвобождается автоматически? То-есть...

Высвобождение памяти для 3 измерения массива
Здравствуйте. Не могу понять почему выходит ошибка. Я сделал 3х мерный массив, у которого 2 строки...

52
495 / 377 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
19.06.2015, 09:48 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от hoggy Посмотреть сообщение
ага.
инициализация по дефолту:
Код C++
1
2
3
4
5
// some.cpp
// --- выносить инициализацию все равно придется
// но можно не указывать чем инициализируем
int some::staticData;

Понял, спасибо.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
19.06.2015, 09:57 22
Ясно. Простой способ кривой записи глобальной переменной. Для этого класс вообще не нужен.

Добавлено через 5 минут
Цитата Сообщение от hoggy Посмотреть сообщение
ага.
А теперь покажите мне ответ на тот вопрос, который полностью соответствует моим указаниям.

Цитата Сообщение от daslex
а получится ли хотя бы 1?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class A{
  static int x;  //ВЫДЕЛЯЮ PRIVATE!!!
  public:
      A(int x_){x=x_;};
      void show(){cout<<x<<"\n";}
      void add(){x++;}
};
 
 
 
int main(){
 
    A obj1(100);
 
}
Хочу посмотреть на это ага. Я не верю.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
19.06.2015, 10:02 23
Цитата Сообщение от daslex Посмотреть сообщение
Ясно. Простой способ кривой записи глобальной переменной. Для этого класс вообще не нужен.

глобальные переменные - глобальны.
тобишь, доступны в любой точке программы любому желающему.

статический член класса - собственность этого класса.
его можно поместить в приватную зону,
и тогда кто попало лазить, и чего то там менять уже не сможет.

например, счетчик экземпляров класса.
его увеличивать или уменьшать имеют право только экземпляры самого класса.

представьте себе, если бы он был доступен любому и каждому.

такой класс бы уже просто не смог бы гарантировать качество и стабильность своей работы.

Добавлено через 3 минуты
Цитата Сообщение от daslex Посмотреть сообщение
Хочу посмотреть на это ага. Я не верю.
http://ideone.com/WhY8Q2
2
daslex
19.06.2015, 10:13
  #24

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
представьте себе, если бы он был доступен любому и каждому.
В public, о котором я выразился оно так и есть.

0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
19.06.2015, 10:26 25
Цитата Сообщение от daslex Посмотреть сообщение
В public, о котором я выразился оно так и есть.
ну даже если и публичный.

если бы вы использовали для десяти разных классов 10 разных глобальных переменных,
то как минимум, это было бы 10 разных имен глобальных переменных.
уже не удобно.

к тому же не очевидно, к чему эти переменные относятся.

а так получается хорошо читабельная запись:
C++
1
2
3
4
5
// максимальные скорости передвижения игровых объектов
// для какой нибудь стратегии
std::cout << ship::max_speed <<std::endl;
std::cout << tank::max_speed <<std::endl;
std::cout << unit::max_speed  <<std::endl;
и я вам сейчас скажу одну вещь:
в качественном, профессиональном с++ коде не используют ни глобальных переменных,
ни статических членов без крайней необходимости.
(которая на моей памяти не возникала ни разу).

потому что и то, и другое не безопасно.

вместо этого используют локальные статические переменные.
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
19.06.2015, 11:18 26

Не по теме:

Кому нам, мне? Я их не использую, поэтому о них не знаю, но бывает используют. Простой пример когда человек очень хорошо знает синтаксис языка, но его переклинило и из головы вылетела элементарнейшая деталь, он может её использовать. Прецеденты были в том числе на один из моих вопросов: "A как без static", был ответ "никак" , хотя потом другой человек поправил., что можно. Вот знал же, но деталь просто вылетела. Другой человек приводит примеры со static и говорит, что он препочел этот вариант, потому что посчитал этот способ лучше. И таких примеров много, когда лучших ответов у них за 1000.



Добавлено через 3 минуты

Не по теме:

я В рекурсии static использую иногда'

0
55 / 56 / 34
Регистрация: 29.12.2012
Сообщений: 478
19.06.2015, 12:20  [ТС] 27
daslex, у меня рядом компилятора небыло=)

Добавлено через 1 минуту
потому и вроде

Добавлено через 2 минуты
не по теме:
daslex, я раньше сувал static везде например для работы с масивом =)мне как то нравилось это...

Добавлено через 42 секунды
а как делать сообшения серым текстом кстате
0
daslex
19.06.2015, 12:22
  #28

Не по теме:

Чуть правее смайлов есть off

0
Черный мечник
19.06.2015, 12:56  [ТС]
  #29

Не по теме:

Спс

0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
19.06.2015, 13:58 30
Цитата Сообщение от hoggy Посмотреть сообщение
если бы вы использовали для десяти разных классов 10 разных глобальных переменных,
то как минимум, это было бы 10 разных имен глобальных переменных.
hoggy, А это случаем не расценивается как дублирование кода? Просто очень на это похоже и мне даже с одним классом мозолит глаза.
C++
1
2
3
4
5
6
7
class Cl{
     static int R,E,S,P,U,B,L,I,C,A;
public:
};
int Cl::R,E,S,P,U,B,L,I,C,A;
 
int main(){}
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
19.06.2015, 14:08 31
Цитата Сообщение от daslex Посмотреть сообщение
А это случаем не расценивается как дублирование кода?
не понял вопроса.
0
70 / 64 / 40
Регистрация: 17.02.2014
Сообщений: 265
19.06.2015, 14:19 32
Цитата Сообщение от hoggy Посмотреть сообщение
и я вам сейчас скажу одну вещь:
в качественном, профессиональном с++ коде не используют ни глобальных переменных,
ни статических членов без крайней необходимости.
(которая на моей памяти не возникала ни разу).
потому что и то, и другое не безопасно.
вместо этого используют локальные статические переменные.
Это бред, приведу ваш пример со стратегией, на карте бегает 100 одинаковых юнитов у каждого свое здоровье,свое оружие, и т.д, но например одна текстура - если они все будут использовать один и тот же участок памяти, как тут быть без статического поля ? Примеров может быть больше - например программирование микроустройств где сильно ограничена память.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,882
19.06.2015, 14:26 33
Цитата Сообщение от hoggy Посмотреть сообщение
не понял вопроса.
одно и то же, но с небольшим отклонением -едва ли не дубль. Добавляя 1 значение, надо его описывать дважды, едва ли не дубль.
Я слишком не профи, чтобы говорить о проф., но я не исключаю, что static переменные используют для двух-трех переменных внутри класса, но исключаю, что их может быть слишком много внутри класса (10 уже черезчур), потому что слишком все это близко к дублированию.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
19.06.2015, 14:36 34
Цитата Сообщение от smartpointer Посмотреть сообщение
Это бред, приведу ваш пример со стратегией, на карте бегает 100 одинаковых юнитов у каждого свое здоровье,свое оружие, и т.д, но например одна текстура - если они все будут использовать один и тот же участок памяти, как тут быть без статического поля ?
вы называете бредом вещи, в которых не разбираетесь.

1.
если уж вам так сильно критично использовать статику,
то к вашим услугам локальные статические переменные.
с их помощью можно сделать все тоже самое,
что и с обычными статическими переменными.
но они не имеют недостатков последних и они безопасны.

2.
по уму за такие вещи отвечает менеджер ресурсов.
к вашим услушам смарт-указатели,
которые умеют расшаривать права владения ресурсами между различными потребителями.

Добавлено через 4 минуты
Цитата Сообщение от daslex Посмотреть сообщение
одно и то же, но с небольшим отклонением -едва ли не дубль. Добавляя 1 значение, надо его описывать дважды, едва ли не дубль.
Я слишком не профи, чтобы говорить о проф., но я не исключаю, что static переменные используют для двух-трех переменных внутри класса, но исключаю, что их может быть слишком много внутри класса (10 уже черезчур), потому что слишком все это близко к дублированию.
не уверен, что уловил вашу мысль.
на практике статические члены вообще не часто встречаются.

а так, что бы их было много, да в одном классе...
лично я такое видел только библиотеке CEGUI.
там статическими std::string задавались всякие рантайм-идентификаторы.
типа.. "это - кнопка", её менеджер "имя такое то", менеджер событие "имя такое то".
и тп.

менеджер сидит на менеджере и менеджером погоняет.

уверен, что можно было бы сделать получше.
ну да ладно.




и нужно сказать - паршивая библиотека в плане дизайна использования.
1
daslex
19.06.2015, 14:47
  #35

Не по теме:

Все-таки встречается на практике :yahoo:
Короче один фиг, static как goto мог бы вполне стать излишеством. goto бывает полезен, хотя все топят его безжалостно, вероятно и static тоже также. А насчет глобальных, если правильно помню, то видел, что как-то при работе с файлами требовались именно глобальные переменные. Кажется при разделении класса на файлы

0
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
19.06.2015, 16:50 36
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef List
#define List
//Односвязный список
 
class list                  
{
 protected:
     int myValue;             //Непосредственно число 
     list *myNext;            //Указатель на следушию ячейку
 public:
     list(int value);
     ~list();
     virtual void push_back(int value);//добавления элемента
     int lentgh();             //размер списка
     virtual void pop_back();
};
#endif  List
Это у Вас ни фига не список. Т.к. при каждом добавлении нового звена Вы инстанцируете новый list. Таким образом Ваш "список" получается как "цепь списков", в которой каждое звено единично. По этой причине Ваш деструктор вызывается много раз (столько же сколько эекземпляров класса Вы создаете). Вот пример, правда двусвязный.
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
template <class T>
class myList {
private:
 
    struct node_t {
        T value;
        node_t * next;
        node_t * prev;
    };
 
    struct head_t {
        int length;
        node_t * item;
    };
 
    head_t head;
 
public:
 
    myList () {
        head.length = 0;
    }
 
    T pop_back(void) {
        T value = head.item->prev->value;
        node_t * ptr = head.item->prev;
 
        head.item->prev = head.item->prev->prev;
        head.item->prev->next = head.item;
        --head.length;
 
        delete ptr;
        return value;
    }
 
    void push_back(T value) {
        node_t * node = new node_t;
        node->value = value;
 
        if (this->empty()) {
            node->next = node;
            node->prev = node;
            head.item = node;
        }
        else {
            node->next = head.item;
            node->prev = head.item->prev;
            head.item->prev->next = node;
            head.item->prev = node;
        }
        ++head.length;
 
        return;
    }
 
    bool empty() {
        return head.length == 0;
    }
 
    ~myList() {
        while(not this->empty()) {
            T value = this->pop_back();
        }
    }
};
Добавлено через 6 минут
Да, еще добавлю. Я сделал именно двусвязный список потому что у Вас есть методы push_back, pop_back. Для односвязных списокв эти методы не особо-то и нужны, т.к. сложность добавления/извлечения O(n), когда в двусвязном списке эти же операции выполняются за O(1). В односвязный список нет смысла добавлять элемент в конец.
0
70 / 64 / 40
Регистрация: 17.02.2014
Сообщений: 265
19.06.2015, 17:05 37
Собственно никто еще не привел, идеального списка - его фишка это удаление\добавление в произвольное место, с постоянной сложностью.
0
55 / 56 / 34
Регистрация: 29.12.2012
Сообщений: 478
19.06.2015, 17:08  [ТС] 38
castorsky, спс, обязательно посмотрю сравню со своим,но эта так сказать реанимированая тема в которой пошли другие вопросы(обговоры), а тот список был базовым для двухсвязного...
Цитата Сообщение от castorsky Посмотреть сообщение
Таким образом Ваш "список" получается как "цепь списков"
за это спасибо, я это понимал, но сказать это правильно немог)
0
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
19.06.2015, 17:19 39
Цитата Сообщение от Черный мечник Посмотреть сообщение
а тот список был базовым для двухсвязного...
В первоначальной Вашей реализации есть серьезный архитектурный деффект. Скорее от непонимания либо самой структуры данных, либо ООП. Мой пример призван показать Вам что список с произвольным количеством элементов есть один экземпляр класса. У Вас каждое звено - отдельный экземпляр класса. Это главное, что я хотел донести.

Добавлено через 1 минуту
Цитата Сообщение от smartpointer Посмотреть сообщение
Собственно никто еще не привел, идеального списка - его фишка это удаление\добавление в произвольное место, с постоянной сложностью.
хм... есть и другие структуры данных. Доступ к элементу массива, например, O(1).
0
859 / 448 / 112
Регистрация: 06.07.2013
Сообщений: 1,491
19.06.2015, 17:30 40
Цитата Сообщение от hoggy Посмотреть сообщение
у каждого свое здоровье,свое оружие, и т.д, но например одна текстура
и при чем тут статическое поле, когда они при помощи обычного указателя могут указывать на один участок памяти
0
19.06.2015, 17:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.06.2015, 17:30
Помогаю со студенческими работами здесь

Высвобождение памяти Free Си
В общем столкнулся с такой проблемой не могу высвободить область выделенной памяти . Пожалуйста...

Высвобождение памяти компонента
Добрый вечер, снова я. Не подскажите как организовать следующее: допустим я создаю динамический...

Высвобождение памяти массивов
Доброго времени суток! Такой вопрос: Как освободить выделенную память под массивы arr1, arr2,...

Высвобождение памяти занимаемой деревом.
Есть код построения и поиска максимального значения элемента дерева, как удалить дерево для...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru