С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Linzman
0 / 0 / 0
Регистрация: 31.10.2012
Сообщений: 48
#1

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

05.05.2013, 22:15. Просмотров 321. Ответов 6
Метки нет (Все метки)

Всем доброго времени суток ! У меня есть следующий метод в заголовочном файле :
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", скорее всего связанная с тем что неправильно выделяется память в каком-то из конструкторов. Помогите решить проблему !
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.05.2013, 22:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Выделение памяти в методе (C++):

Утечка памяти в методе - C++
Здравствуйте! Написал свой метод для собственной структуры String. Метод должен приклеивать к исходной строке новую. В методе происходит...

Освобождение памяти в методе класса - C++
Здравствуйте, В университете дали задание написать написать стек с итератором произвольного доступа. Собственно, класс стека и итератора...

Распределение памяти. Динамическое выделение памяти - C++
an-1 an-2 ... a2

Выделение памяти, проверка на утечку памяти - C++
Интересуют два вопроса: 1. Правильно ли устроен алгоритм выделения, удаление и запись ячейки памяти? Может быть, есть более простые...

Как сделать так чтобы при каждом выделении памяти в методе была возможность ее очистить и вернуть результат? - C++
Доброго времени суток! Есть код класса и хотелось бы устранить в нем следующие недочеты: 1) Как сделать так чтобы при каждом выделении...

Выделение памяти - C++
Часто возникает такая проблема, когда конфигурирую проект как Release происходит ошибка выделения памяти (при вызывании new), например...

6
Байт
Нарушитель
Эксперт C
16695 / 10959 / 1689
Регистрация: 24.12.2010
Сообщений: 21,383
05.05.2013, 22:25 #2
Первое, что бросилось в глаза, конструктор Array() не устанавливается length = 0;
1
Linzman
0 / 0 / 0
Регистрация: 31.10.2012
Сообщений: 48
05.05.2013, 22:30  [ТС] #3
Байт, Исправил. Проблема осталась
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
05.05.2013, 22:37 #4
Linzman, Вам бы конструктор копирования не помешало добавить. См Правило трех. Походу у Вас двойное удаление памяти наблюдается где-то или что-то смежное с этим.
0
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];
            }
        }
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
05.05.2013, 22:56 #6
Linzman, конструктор копирования это не оператор присваивания
К тому же оператор присваивания должен возвращать объект, а не void.
1
Linzman
0 / 0 / 0
Регистрация: 31.10.2012
Сообщений: 48
06.05.2013, 11:08  [ТС] #7
Tulosba, все, сделал конструктор копирования и заработало. Спасибо !
0
06.05.2013, 11:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.05.2013, 11:08
Привет! Вот еще темы с ответами:

Выделение памяти... - C++
Вот решил себе ликбез устроить и возникли вопросы: 1) Почему char* p = &quot;fffff&quot;; не реагирует на delete p 2) Когда надо...

Выделение памяти - C++
В чём ошибка выделения памяти? Подскажите, друзья! #include &quot;stdafx.h&quot; #include &quot;stdio.h&quot; #include &lt;iostream&gt; #include...

До выделение памяти в С++ - C++
Всем приветик. Вообщем есть некоторые сложности с довыделение памяти... Что я хочу сделать: есть 2-х мерный массив (он ещё и квадратный)....

Выделение памяти - C++
Здравствуйте! #include&lt;iostream&gt; int main() { int *mass = new int ; int *mass2 = new int ; std::cout &lt;&lt; (unsigned int)mass &lt;&lt;...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.