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

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

Войти
Регистрация
Восстановить пароль
 
 
GBIT
12 / 12 / 1
Регистрация: 05.10.2011
Сообщений: 219
#1

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

26.10.2011, 08:59. Просмотров 727. Ответов 18
Метки нет (Все метки)

Все идет замечательно, но вот когда происходит удаление массива программа крашится..

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
#include <iostream>
 
using namespace std;
 
void main()
{
    setlocale(LC_ALL, "Russian");
    
    int n;
    int i;
 
    cout<<"Введите размерность таблицы\t";
    cin>>n;
    
    char **TableH = new char* [n];
    for(i=0;i<n;i++)
        TableH[i] = new char[32];
    
    for(i=0;i<n;i++)
        TableH[i]="-1";
    cout<<"Таблица идентификаторов размерности   n="<<n<<"  создана"<<endl;
 
 
////////////////////////////////// QUIT 
    for(i=0;i<n;i++)
    {
        delete [] TableH[i];
    }
 
    delete [] TableH;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.10.2011, 08:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка при освобождении памяти (C++):

Ошибка при освобождении памяти - C++
#include &lt;iostream&gt; using namespace std; #include &lt;stdlib.h&gt; #include &lt;fstream&gt; #include &lt;stdio.h&gt; void *malloc (size_t...

Ошибка при освобождении памяти - C++
#include &lt;iostream&gt; using namespace std; template&lt;class T&gt; class pvector { T **p; int sz; public:

Ошибка при освобождении памяти? - C++
Доброго времени суток! Я только-только взялся за изучение c++. Дошел до динамической памяти (разбираю по учебнику) и столкнулся с...

Ошибка при освобождении памяти - C++
Добрый День! Написал простую программу для понимания сути. Проблема в том, что код, который прилагается выдает ошибку. Но если убрать...

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

Ошибка при освобождении памяти - C++
Задача: Из стандартного входного потока вводятся сроки. Признаком завершения каждой сроки является символ ‘\n’. Признаком конца текста...

18
accept
4825 / 3246 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
26.10.2011, 09:10 #2
Цитата Сообщение от GBIT
C++
1
TableH[i]="-1";
используй strcpy()
0
GBIT
12 / 12 / 1
Регистрация: 05.10.2011
Сообщений: 219
26.10.2011, 15:33  [ТС] #3
да да. все верно. при использовании
Цитата Сообщение от accept Посмотреть сообщение
strcpy()
все отлично освобождается.

вот только у меня есть допустим:
C++
1
2
if(TableH[i]="-1")
     cout<<"(none)";
и этот if уже становится НЕ рабочим...
0
vndtta
90 / 67 / 13
Регистрация: 17.10.2011
Сообщений: 235
Завершенные тесты: 1
26.10.2011, 15:49 #4
Цитата Сообщение от GBIT Посмотреть сообщение
Все идет замечательно, но вот когда происходит удаление массива программа крашится..

C++
1
2
3
...
    char **TableH = new char* [n];
...
не знаю поможет ли, попробуй
C++
1
char* TableH[] = new char* [n]
0
-=ЮрА=-
Заблокирован
Автор FAQ
26.10.2011, 16:00 #5
GBIT, думаю от конца нужно удалять к тому же этим
Цитата Сообщение от GBIT Посмотреть сообщение
delete [] TableH;
как мне кажется уже высвобожденную память удалить пытаемся
Вот код без бага при выходе...
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
#include <iostream>
#include <cstring>
using namespace std;
 
//ГђГіГ±Г±ГЁГґГЁГЄГ*öèÿ - ïåðåãðóçêîé îïåðГ*òîðГ* <<
ostream& operator<<(ostream &stream,char* s){
    for(char* ps=s; *ps; ps++){
        if(*ps=='Вё')
            stream<<char(241);
        else if(*ps=='ВЁ')
            stream<<char(240);
        else if(*ps>=-64 && *ps<=-17)           
            stream<<char(*ps+64+128);
        else if(*ps<0)
            stream<<char(*ps+64+176);
        else
            stream<<*ps;
    }
    return stream;
}
 
int main()
{
   cout<<"Ââåäèòå Г°Г*çìåðГ*îñòü ГІГ*áëèöû\t";
   int i,n;cin>>n;
        
   char **TableH = new char*[n];
   for(i=0;i<n;i++)
   {
       TableH[i] = new char[32];
       sprintf(TableH[i],"%d","i");
   } 
   cout<<"Г’Г*áëèöГ* ГЁГ§ n="<<n<<"ñòðîê ñîçäГ*Г*Г*"<<endl;
 
   //ÓäГ*ëÿåì Г±ГЄГ®Г*Г¶Г* ГЁГ*Г*Г·ГҐ òåðÿåòñÿ Г±ГўГїГ§Г*îñòü áëîêîâ
   for(i=n - 1;0 <= i;i--)
      delete [] TableH[i];
 
   system("pause");
   return 0;
}
0
GBIT
12 / 12 / 1
Регистрация: 05.10.2011
Сообщений: 219
26.10.2011, 16:26  [ТС] #6
точно не знаю по чему, но это
Цитата Сообщение от vndtta Посмотреть сообщение
не знаю поможет ли, попробуй
Код C++
1
char* TableH[] = new char* [n]
точно не работает. при таком выделении памяти получается не массив строк, а... что то другое


Цитата Сообщение от GBIT Посмотреть сообщение
for(i=0;i<n;i++)
{
delete [] TableH[i];
}
delete [] TableH;
Такое освобождение памяти мне подсказали тут
И мне кажется это правильное освобождение..

Код
типа есть массив:
[quote=GBIT;2105382]char **TableH = new char* [n];
for(i=0;i<n;i++)
TableH[i] = new char[32];[/quote]
[] + 31а ячейка [] [] [] [] [] [] ... []
[] + 31а ячейка [] [] [] [] [] [] ... []
[] + 31а ячейка [] [] [] [] [] [] ... []
...
[] + 31а ячейка [] [] [] [] [] [] ... []
и при удалении
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
for(i=n - 1;0 <= i;i--)
delete [] TableH[i];
получается картина:
Код
[X] + 31а ячейка [] [] [] [] [] [] ... []
[X] + 31а ячейка [] [] [] [] [] [] ... []
[X] + 31а ячейка [] [] [] [] [] [] ... []
...
[X] + 31а ячейка [] [] [] [] [] [] ... []

[X] - это та память, что мы освободили
или все же бред написал?
0
-=ЮрА=-
Заблокирован
Автор FAQ
26.10.2011, 16:41 #7
ох и кучу всего написал-
Удаление идёт ступенчато, каждый раз удаляется последняя строка в текстовом блоке TableH...

Не по теме:

Эмм и не стоит всему слепо верить, что вам на форуме пишут, вспомните хотя бы про wav-файл, помнится там вам 10 постов сделали, а достаточно было двух моих примеров

0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
26.10.2011, 16:41 #8
GBIT,
C++
1
 if(TableH[i]="-1")
неправильно.

C++
1
if (!strcmp(TableH[i], "-1"))
правильно.
0
-=ЮрА=-
Заблокирован
Автор FAQ
26.10.2011, 16:47 #9
Цитата Сообщение от GBIT Посмотреть сообщение
И мне кажется это правильное освобождение..
-
У вас идёт связный блок
abcd
efgh
ijklm
nopq
И тут вы хотите чтобы стерев abcd, ячейка а по прежнему на оставшуюся память указывала
----
efgh
ijklm
nopq
Как по мне так странновато!

Добавлено через 1 минуту
Цитата Сообщение от ForEveR Посмотреть сообщение
if(TableH[i]="-1")
- где в коде GBIT, условный оператор, как я понял там инициализация строки предполагалась
Цитата Сообщение от GBIT Посмотреть сообщение
TableH[i]="-1";
0
HighPredator
5544 / 1857 / 346
Регистрация: 10.12.2010
Сообщений: 5,479
Записей в блоге: 2
26.10.2011, 16:57 #10
Цитата Сообщение от GBIT Посмотреть сообщение
C++
1
if(TableH[i]="-1") cout<<"(none)";
У вас идет присвоение, а не сравнение.
0
GBIT
12 / 12 / 1
Регистрация: 05.10.2011
Сообщений: 219
26.10.2011, 16:58  [ТС] #11
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Удаление идёт ступенчато, каждый раз удаляется последняя строка в текстовом блоке TableH...
что это значит? 8)
можно еще доступнее?

Не по теме:

да да еще доступнее)


Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
У вас идёт связный блок
abcd
efgh
ijklm
nopq
И тут вы хотите чтобы стерев abcd, ячейка а по прежнему на оставшуюся память указывала
----
efgh
ijklm
nopq
Как по мне так странновато!
в смысле что удаление с самой последней ступени поднимается вверх?


Цитата Сообщение от ForEveR Посмотреть сообщение
Код C++
if (!strcmp(TableH[i], "-1"))
правильно.
вот именно так я у себя и переделал. но все же не понятно почему
Цитата Сообщение от ForEveR Посмотреть сообщение
Код C++
*if(TableH[i]="-1")
не работает?

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if(TableH[i]="-1")
ой. я тут хотел поставить сравнение на равенство
C++
1
if(TableH[i]=="-1")
0
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
26.10.2011, 16:59 #12
GBIT, у меня Ваш код работает и так нормально (компилятор - minigw).
Хотя вот это лучше исправить
C++
1
2
        for(i=0;i<n;i++)
                TableH[i]="-1";
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
26.10.2011, 17:04 #13
Да не надо указателям присваивать указатели. Зачем несколько указателей на одну область памяти? Надо копировать и записывать в область памяти.
0
GBIT
12 / 12 / 1
Регистрация: 05.10.2011
Сообщений: 219
26.10.2011, 17:12  [ТС] #14
Цитата Сообщение от ForEveR Посмотреть сообщение
Зачем несколько указателей на одну область памяти?
это я не указатели делал. просто инициализировал значением весь массив строк.

потом то и применялся
C++
1
2
if (!strcmp(TableH[i], "-1"))
        cout<<"(none)";  // мол строка пустая и в нее еще ничего не вписывали.
0
-=ЮрА=-
Заблокирован
Автор FAQ
26.10.2011, 17:19 #15
Gepar, у
GBIT, стоит скорее всего Visual Studio и то что прокатит в MinGW может не прокатить в студии, например в студии нет Variable Length Array
GBIT, мне сложно рассказать ещё доступней - доступней так выделив память у вас в руках появился портфель, и тут вы хотите его постепенно сжечь, вы пережгли ручку и портфель упал на замлю и доступа к нему уже нет, другое дело если вы подожжёте портфель со стороны дна, так же и с массивом
Цитата Сообщение от GBIT Посмотреть сообщение
if(TableH[i]=="-1")
- это неверно, строки сравниваются как и сказал
ForEveR, strcmp
После выделения памяти в массив вы ничего не записали, тогда откуда надеетесь в строке хоть один символ для сравнения найти - она же ещё пуста...
0
26.10.2011, 17:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.10.2011, 17:19
Привет! Вот еще темы с ответами:

Ошибка при освобождении памяти - C++
Здравствуйте! Пишу на MS Visual C++ 2010, windows 7. При вызове функции resize() на строке delete arr; происходит ошибка,...

Ошибка при освобождении памяти - C++
Здравствуйте, программа завершает работу в этом коде #include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;cmath&gt; int main() { ...

Ошибка при освобождении памяти (delete) - C++
Здравствуйте! Есть массив lines, созданный вот так : int *line = new int ; Потом, пытаюсь его удалить и пересоздать : delete...

Ошибка при освобождении памяти массива char* - C++
Класс должен читать слова из файла (C:\\IN.TXT) по одному, и выводить на экран. Почему появляется ошибка в строке 56, и в конце...


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

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

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