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

Выделение памяти в методе - C++

Восстановить пароль Регистрация
 
Linzman
0 / 0 / 0
Регистрация: 31.10.2012
Сообщений: 48
05.05.2013, 22:15     Выделение памяти в методе #1
Всем доброго времени суток ! У меня есть следующий метод в заголовочном файле :
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
class Array:
    public Container{
    private:
        char* data;
        int length;
    public:
        Array(int n){
        data=new char[n];
        length=n;
        }
        Array(){
            data=new char[0];}
        ~Array(){
        delete[] data;
        }
        void operator=(Array& a){
            delete[] data;
            data=new char [a.length];
            length=a.length;
            for(int i=0;i<length;i++)
                data[i]=a.data[i];
        }
}
class Group{
    private:
        Array* Name;
        Array* LastName;
        int len;
    public:
        Group(){
            len=0;      
            Name=new Array[0];
            LastName=new Array[0];
        }
        Group(int n){
        len=n;
        Name=new Array[n];
        LastName=new Array[n];
        }
        ~Group(){
        delete[] Name;
        delete[] LastName;
        }
                      void operator = (Group a){
        delete[] Name;
        delete[] LastName;
        len=a.len;
        Name=new Array[len];
        LastName=new Array[len];
        for(int i=0;i<a.len;i++){
                Name[i]=a.Name[i];
                LastName[i]=a.LastName[i];
            }
        }
Group Cut(int n,int m){
        Group b(m-n);
        for(int i=0;i<m-n;i++){
            b.Name[i]=Name[n+i];
            b.LastName[i]=LastName[n+i];
        }
        return b;
        };
        Group operator +(Group b){
            Group c(len+b.len);
            for(int i=0;i<len;i++){
            c.Name[i]=Name[i];
            c.LastName[i]=LastName[i];
            }
            for(int i=len;i<len+b.len;i++){
            c.Name[i]=b.Name[i-len];
            c.LastName[i]=b.LastName[i-len];
            }
            return c;
        }
void AddMember(int n, Array& name,Array& lastname){
            Group b;
            Group a(1);
            if(len==0){
                a.Name[0]=name;
                a.LastName[0]=lastname;
                *this=a;
            }
            else{
                if(n==len){
                b=Cut(0,len);
                        a.Name[0]=name;
                        a.LastName[0]=lastname;
                        *this=b+a;
                }
                else{
                    switch(n){
                        case 0:
                            b=Cut(0,len);
                            a.Name[0]=name;
                            a.LastName[0]=lastname;
                            *this=a+b;
                        ;
                        default:
                            b=Cut(0,n);
                            Group c=Cut(n,len);
                            a.Name[0]=name;
                            a.LastName[0]=lastname;
                            *this=(b+a)+c;
                    }
                }
            }
        };
}
При использовании последнего элемент нормально добавляется ( я пробовал к пустому списку добавлять элемент Array(не обращайте внимания что он так называется, исторически сложилось, это просто класс, содержащий длину строки и строку)) выскакивает ошибка "_Block_Type_Is_Valid", скорее всего связанная с тем что неправильно выделяется память в каком-то из конструкторов. Помогите решить проблему !
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.05.2013, 22:15     Выделение памяти в методе
Посмотрите здесь:

Выделение памяти C++
C++ Выделение памяти
Выделение памяти C++
Выделение памяти C++
Выделение памяти C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Байт
 Аватар для Байт
14004 / 8835 / 1234
Регистрация: 24.12.2010
Сообщений: 16,014
05.05.2013, 22:25     Выделение памяти в методе #2
Первое, что бросилось в глаза, конструктор Array() не устанавливается length = 0;
Linzman
0 / 0 / 0
Регистрация: 31.10.2012
Сообщений: 48
05.05.2013, 22:30  [ТС]     Выделение памяти в методе #3
Байт, Исправил. Проблема осталась
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
05.05.2013, 22:37     Выделение памяти в методе #4
Linzman, Вам бы конструктор копирования не помешало добавить. См Правило трех. Походу у Вас двойное удаление памяти наблюдается где-то или что-то смежное с этим.
Linzman
0 / 0 / 0
Регистрация: 31.10.2012
Сообщений: 48
05.05.2013, 22:43  [ТС]     Выделение памяти в методе #5
Tulosba, прошу прощения, забыл добавить. Он у меня есть
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
void operator = (Group a){
        delete[] Name;
        delete[] LastName;
        len=a.len;
        Name=new Array[len];
        LastName=new Array[len];
        for(int i=0;i<a.len;i++){
                Name[i]=a.Name[i];
                LastName[i]=a.LastName[i];
            }
        }
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
05.05.2013, 22:56     Выделение памяти в методе #6
Linzman, конструктор копирования это не оператор присваивания
К тому же оператор присваивания должен возвращать объект, а не void.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.05.2013, 11:08     Выделение памяти в методе
Еще ссылки по теме:

Выделение памяти C++
Освобождение памяти в методе класса C++
Как сделать так чтобы при каждом выделении памяти в методе была возможность ее очистить и вернуть результат? C++

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

Или воспользуйтесь поиском по форуму:
Linzman
0 / 0 / 0
Регистрация: 31.10.2012
Сообщений: 48
06.05.2013, 11:08  [ТС]     Выделение памяти в методе #7
Tulosba, все, сделал конструктор копирования и заработало. Спасибо !
Yandex
Объявления
06.05.2013, 11:08     Выделение памяти в методе
Ответ Создать тему
Опции темы

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