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

Стек и освобождение памяти - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.67
gGrn-7DA
мну довольно <(-__-)l
 Аватар для gGrn-7DA
203 / 192 / 1
Регистрация: 17.01.2010
Сообщений: 2,391
Завершенные тесты: 1
05.04.2011, 14:26     Стек и освобождение памяти #1
Пишу класс стека, реслизую в виде односвязного списка.
stack.h
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
#ifndef STACK_H_INCLUDED
#define STACK_H_INCLUDED
 
template <class Type> class Member{
public:
    Member<Type>(Type value, Member<Type> **member);
    ~Member();
    Type GetValue(){
        return _value;
    }
private:
    Member<Type> *_member;
    Type _value;
};
 
 
template <class Type> class stack{
public:
    stack();
    ~stack();
    int in(Type value);
    Type out();
    Type see();
private:
    Member<Type> *_member;
    int _count;
 
};
 
 
#endif // STACK_H_INCLUDED
stack.cpp
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
#include "stack.h"
 
//-----=---==-=== class Member ===-==---=-----
 
template <class Type> Member<Type>::Member<Type>(Type value, Member **member){
    _value=value;
    _member=*member;
}
 
template <class Type> Member<Type>::~Member<Type>(){
    delete _member;
}
 
//-----=---==-=== class stack ===-==---=-----
 
template <class Type> stack<Type>::~stack(){
    delete _member;
}
 
template <class Type> stack<Type>::stack(){
    _count=0;
    _member=NULL;
}
 
template <class Type> int stack<Type>::in(Type value){
    _count++;
    Member *member=new Member(value, &_member);
    _member=member;
    return _count;
}
 
template <class Type> Type stack<Type>::out(){
    _count--;
    Type value=_member->GetValue();
    Member member=*_member->_member;
    _member->_member=NULL;
    delete _member;
    _member=&member;
    return value;
}
 
template <class Type> Type stack<Type>::see(){
    return _member->GetValue();
}
1 вопрос - правильно ли я построил метод stack::out() - он должен вернуть верхнее значение в стеке и удалить его из памяти. не повредеив остальным данным.
2 вопрос - можно ли как-то определить класс Member внутри определения класса stack? Без использования шаблона это легко, а вот с ним мне что-то не получается понять логику...

Добавлено через 29 минут
не компилится вообще - вот ошибки какие выдает:
stack.cpp|5|error: function "Member<Type>::Member(Type, Member<Type> **)" has already been defined|
stack.cpp|10|error: function "Member<Type>::~Member" has already been defined|
stack.cpp|16|error: function "stack<Type>::~stack" has already been defined|
stack.cpp|20|error: function "stack<Type>::stack()" has already been defined|
stack.cpp|25|error: function "stack<Type>::in" has already been defined|
stack.cpp|32|error: function "stack<Type>::out" has already been defined|
stack.cpp|42|error: function "stack<Type>::see" has already been defined|
||=== Build finished: 7 errors, 0 warnings ===|
Поможете разобраться???
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.04.2011, 14:26     Стек и освобождение памяти
Посмотрите здесь:

C++ Освобождение памяти
C++ Освобождение памяти
резервирование памяти/освобождение памяти для трехмерного массива C++
Освобождение памяти C++
C++ Освобождение памяти в C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
05.04.2011, 14:29     Стек и освобождение памяти #2
gGrn-7DA, Вообще по сути Удалять и возвращать должны два разных метода. Концептуально размышлять если.
А. На тему шаблона.
C++
1
2
3
4
5
6
7
8
9
10
11
12
template <class Type> class stack{
public:
    stack();
    ~stack();
    int in(Type value);
    Type out();
    Type see();
private:
    Member<Type> *_member;
    int _count;
 
};
При int выйдет Stack<int> с членом Member<int>*...
Да и вообще. Не стоит так с указателями играться...
И вообще, шаблонные классы стоит и определять и описывать в одном файле (в хедере).
gGrn-7DA
мну довольно <(-__-)l
 Аватар для gGrn-7DA
203 / 192 / 1
Регистрация: 17.01.2010
Сообщений: 2,391
Завершенные тесты: 1
06.04.2011, 10:58  [ТС]     Стек и освобождение памяти #3
Цитата Сообщение от ForEveR Посмотреть сообщение
Вообще по сути Удалять и возвращать должны два разных метода.
Возможно, в стандарты не углублялся пока. А само освобождение памяти работать будет, нигде хвосты не останутся?

Цитата Сообщение от ForEveR Посмотреть сообщение
Да и вообще. Не стоит так с указателями играться...
С чем хочу с тем играю. И оно кроме всего должно еще и работать)
Цитата Сообщение от ForEveR Посмотреть сообщение
И вообще, шаблонные классы стоит и определять и описывать в одном файле (в хедере).
Приму к сведениям) - помогло избаиться от ерроров)

Добавлено через 5 часов 51 минуту
в продолжение темы. привыполнении этой строки из определения stack<Type>::out()
C++
1
    Member<Type> member=*_member->_member;
Выходит ошибка Segmentation fault.
В чем ошибка может заключается и как ее исправить?
От игр с указателями не откажусь ни за что!)

Добавлено через 36 минут
Вот исправленный код ошибки, возникавшей при разименовании NULL....

Добавлено через 10 секунд
C++
1
2
3
4
5
6
7
8
9
template <typename Type> Type stack<Type>::out(){
    _count--;
    Type value=_member->GetValue();
    Member<Type> *member=_member->_member;
    _member->_member=NULL;
    delete _member;
    _member=member;
    return value;
}
Добавлено через 13 часов 33 минуты
C++
1
2
3
Я использую два таких стека.
    stack<stack<unsigned int> > *temp=new stack<stack<unsigned int> >();
    stack<unsigned int> *_st=new stack<unsigned int>();
При выполнении
C++
1
    temp->in(*_st);
Вылетает ошибка glibc - double free or coruption.
_st инициализирован и количество элементов в нем равно 1. temp тоже инициализирован и кол элементов в нем =0...

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

Добавлено через 8 минут
сам метод возвращает правильное значение количества элементов, как и должен делать...
стек обычных элементов так не вылетает, это наблюдается только при добавлении в стек стеков...
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
06.04.2011, 12:27     Стек и освобождение памяти #4
gGrn-7DA, Ты пустой стек хочешь запихнуть во второй? оО
gGrn-7DA
мну довольно <(-__-)l
 Аватар для gGrn-7DA
203 / 192 / 1
Регистрация: 17.01.2010
Сообщений: 2,391
Завершенные тесты: 1
06.04.2011, 17:24  [ТС]     Стек и освобождение памяти #5
Нет я стек с 1 элементом хочу записать в пустой стек стеков.
_st - всегда будет иметь хотя бы один элемент в себе..


разобрался
C++
1
2
3
    stack<stack<unsigned int> *> *temp=new stack<stack<unsigned int> *>();
    stack<unsigned int> *_st=new stack<unsigned int>();
    temp->in(_st);
так работает...хз почему)

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

Не по теме:

Как же жить без ошибок? можно, но невозможно - обязательно ошибешься...



мой стек съедает первую половину элементов.
то есть такой код:
C++
1
2
3
4
5
6
7
    stack<int> *st=new stack<int>();
    for(int i=0;i<15;i++)
    st->in(i);
    unsigned int g;
    int *m=st->Release(&g);
    for(int j=0;j<g;j++)
    std::cout << m[j] << " ";
выводит:
C++
1
14 13 12 11 10 9 8 7 0 0 0 0 0 0 0
а должен:
C++
1
14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Как объяснить стеку, что есть чужие байты не хорошо?(

Добавлено через 1 минуту
ну и сам файл stack.h
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
template <class Type>
class Member{
public:
    Member(Type value, Member<Type> **member);
    ~Member();
    Type GetValue(){
        return _value;
    }
    Member<Type> *_member;
private:
    Type _value;
};
 
template <class Type> class stack{
public:
    stack();
    ~stack();
    int count();
    int in(Type value);
    Type out();
    Type see();
    Type * Release(unsigned int *length);
private:
    Member<Type> *_member;
    unsigned int _count;
 
};
 
//-----=---==-=== class Member ===-==---=-----
 
template <class Type> Member<Type>::Member(Type value, Member<Type> **member){
    _value=value;
    _member=*member;
}
 
template <class Type> Member<Type>::~Member(){
    delete _member;
}
 
//-----=---==-=== class stack ===-==---=-----
 
template <class Type> stack<Type>::~stack(){
    delete _member;
}
 
template <class Type> stack<Type>::stack(){
    _count=0;
    _member=NULL;
}
 
template <class Type> int stack<Type>::count(){
    return _count;
}
 
template <class Type> int stack<Type>::in(Type value){
    Member<Type> *member=new Member<Type>(value, &_member);
    _member=member;
    return ++_count;
}
 
template <class Type> Type stack<Type>::out(){
        if(_count>0)_count--;
        Type value=_member->GetValue();
        Member<Type> *member=_member->_member;
        _member->_member=NULL;
        delete _member;
        _member=member;
        return value;
}
 
template <class Type> Type stack<Type>::see(){
    return _member->GetValue();
}
 
template <class Type> Type * stack<Type>::Release(unsigned int *length){
    Type *array=new Type[*length=_count];
    for(int i=0;i<_count;i++)
        array[i]=this->out();
    return array;
}
Добавлено через 2 минуты
вот где ошибка( внимательнее надо быть)
C++
1
    for(int i=0;i<_count;i++)//77 строка
Yandex
Объявления
06.04.2011, 17:24     Стек и освобождение памяти
Ответ Создать тему
Опции темы

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