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

Ошибка при освобождении памяти массива string - C++

Восстановить пароль Регистрация
 
Керра
Модератор
 Аватар для Керра
1270 / 438 / 45
Регистрация: 24.08.2011
Сообщений: 2,123
19.12.2013, 21:10     Ошибка при освобождении памяти массива string #1
Вот тут вот при delete возникает ошибка, и пишет "The program '[4292] Array Template.exe: Native' has exited with code 3 (0x3)."
C++
1
2
3
4
5
6
7
8
9
10
11
template <class Type>
void Array<Type>::operator+=(Type value)
{
    Array<Type> tmp(*this); // сохраняем текущий массив
    delete [] theArray; // освобождаем память
    size++; // увеличиваем размер
    theArray = new Type[size]; // создаем новый массив
    for (int i = 0; i < size-1; i++)
        theArray[i] = tmp[i]; // копируем уже имеющиеся элементы
    theArray[size-1] = value; // и добавляем новый
}
Полный код:
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#include "stdafx.h"
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
#include <conio.h>
#include <string>
using std::string;
 
template <class Type>
class Array
{
private:
    Type *theArray;
    int size;
    Type operator[](int n) const; // возвращает значение элемента с порядковым номером n
public:
    Array(); // конструктор по умолчанию
    Array(Type); // конструктор по значению информационного поля
    Array(const Array &); // конструктор-копировщик
    ~Array(); // деструктор
    int GetSize() const; // возвращает размер массива
    void operator += (Type value); // добавляет в конец элемент value
    void Print() const; // выводит на экран
    void Add(Type value); // добавляет в конец элемент value
    int Find(Type value) const; // находит номер элемента (номера начиная с 1), если такого элемента нет, 0
    void Delete(int); // удаляет элемент с заданным номером (номера начиная с 1)
};
 
int main()
{
    cout << "Massiv int" << endl;
    Array<int> a(5); // инициализируем массив элементом 5
    a += 6; // добавляем элемент 6
    a.Add(7); // добавляем элемент 7
    a.Print(); // выводим на экран
    cout << "Nomer elementa '7': " << a.Find(7) << endl;
    cout << "Nomer elementa '3': " << a.Find(3) << endl;
    cout << "Udalim element nr.2..." << endl;
    a.Delete(2);
    a.Print();
    cout << endl;
    getch();
 
    cout << "Massiv double" << endl;
    Array<double> b(5.22);
    b += 6.73;
    b.Add(7.85);
    b.Print();
    cout << "Nomer elementa '7.85': " << b.Find(7.85) << endl;
    cout << "Nomer elementa '3': " << b.Find(3) << endl;
    cout << "Udalim element nr.3..." << endl;
    b.Delete(3);
    b.Print();
    cout << endl;
    getch();
 
    cout << "Massiv string" << endl;
    Array<string> c("Stroka1");
    c += "Stroka2";
    c.Add("Stroka3");
    c.Print();
    cout << "Nomer elementa 'Stroka1': " << c.Find("Stroka1") << endl;
    cout << "Nomer elementa 'Stroka': " << c.Find("Stroka") << endl;
    cout << "Udalim element nr.2..." << endl;
    c.Delete(2);
    c.Print();
    getch();
    return 0;
}
 
template <class Type> // конструктор по умолчанию
Array<Type>::Array(): size(0), theArray(NULL)
{
}
 
template <class Type> // конструктор по значению информационного поля
Array<Type>::Array(Type value): size(1)
{
    theArray = new Type;
    theArray[0] = value;
}
 
template <class Type> // конструктор-копировщик
Array<Type>::Array(const Array &theObject)
{
    size = theObject.GetSize();
    theArray = new Type[size];
    for (int i = 0; i < size; i++)
        theArray[i] = theObject[i]; // и копируем все элементы
}
 
template <class Type> // возвращает размер массива
int Array<Type>::GetSize() const
{
    return size;
}
 
template <class Type> // возвращает значение элемента с порядковым номером n
Type Array<Type>::operator[](int n) const
{
    return theArray[n];
}
 
template <class Type>
void Array<Type>::operator+=(Type value)
{
    Array<Type> tmp(*this); // сохраняем текущий массив
    delete [] theArray; // освобождаем память
    size++; // увеличиваем размер
    theArray = new Type[size]; // создаем новый массив
    for (int i = 0; i < size-1; i++)
        theArray[i] = tmp[i]; // копируем уже имеющиеся элементы
    theArray[size-1] = value; // и добавляем новый
}
 
template <class Type> // деструктор
Array<Type>::~Array()
{
    delete [] theArray;
}
 
template <class Type>
void Array<Type>::Print() const
{
    cout << "Size: " << size << endl << "Array: ";
    for (int i = 0; i < size; i++)
        cout << theArray[i] << " ";
    cout << endl;
}
 
template <class Type>
void Array<Type>::Add(Type value)
{
    Array<Type> tmp(*this); // сохраняем текущий массив
    delete [] theArray; // освобождаем память
    size++; // увеличиваем размер
    theArray = new Type[size]; // создаем новый массив
    for (int i = 0; i < size-1; i++)
        theArray[i] = tmp[i]; // копируем уже имеющиеся элементы
    theArray[size-1] = value; // и добавляем новый
}
 
template <class Type>
int Array<Type>::Find(Type value) const
{
    for (int i = 0; i < size; i++)
        if (theArray[i] == value)
            return i+1;
    return 0;
}
 
template <class Type>
void Array<Type>::Delete(int n)
{
    if ((n < 1) || (n > size))
        return;
    Array<Type> tmp;
    for (int i = 0; i < size; i++)
        if (i != n-1)
            tmp.Add(theArray[i]);
    delete [] theArray;
    size--;
    theArray = new Type[size];
    for (int i = 0; i < size; i++)
        theArray[i] = tmp[i];
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.12.2013, 21:10     Ошибка при освобождении памяти массива string
Посмотрите здесь:

C++ Ошибка при освобождении памяти
Ошибка при освобождении памяти? C++
Ошибка при освобождении памяти C++
Ошибка при освобождении памяти C++
Ошибка при освобождении памяти C++
Ошибка при освобождении памяти массива char* C++
C++ Ошибка при освобождении памяти
Ошибка при освобождении памяти C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,560
Записей в блоге: 17
26.01.2014, 16:04     Ошибка при освобождении памяти массива string #2
Если еще актуально:

Выделяем "не массив" а пытаемся освободить как массив
C++
1
2
3
4
5
6
template <class Type> // конструктор по значению информационного поля
Array<Type>::Array(Type value): size(1)
{
    theArray = new Type; //  не массив !
    theArray[0] = value;
}
C++
1
2
3
4
5
6
7
8
9
10
11
template <class Type>
void Array<Type>::operator+=(Type value)
{
    Array<Type> tmp(*this);  // лишний объект ?? зачем ?
    delete [] theArray;         // <--- пытаемся удалить как массив !!
    size++; // увеличиваем размер
    theArray = new Type[size]; 
    for (int i = 0; i < size-1; i++) 
        theArray[i] = tmp[i]; 
    theArray[size-1] = value;
}
Т.е. рабочий вариант

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
template <class Type> // конструктор по значению информационного поля
Array<Type>::Array(Type value): size(1)
{
    theArray = new Type[size]; // массив
    theArray[0] = value;
}
 
template <class Type>
void Array<Type>::Add(Type value)
{
    Type* tmp= new Type[++size];
 
    for (int i = 0; i < size-1; ++i)
        tmp[i]= theArray[i]; // копируем уже имеющиеся элементы
    tmp[size-1]= value;
 
    delete [] theArray; // освобождаем память
 
    theArray= tmp;
}
 
 
template <class Type>
void Array<Type>::operator+=(Type value)
{
   Add(value);
}
Керра
Модератор
 Аватар для Керра
1270 / 438 / 45
Регистрация: 24.08.2011
Сообщений: 2,123
27.01.2014, 10:16  [ТС]     Ошибка при освобождении памяти массива string #3
Ясно, спасибо большое
Yandex
Объявления
27.01.2014, 10:16     Ошибка при освобождении памяти массива string
Ответ Создать тему
Опции темы

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