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

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

Восстановить пароль Регистрация
 
GBIT
 Аватар для GBIT
11 / 11 / 1
Регистрация: 05.10.2011
Сообщений: 219
26.10.2011, 08:59     Ошибка при освобождении памяти #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
#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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.10.2011, 08:59     Ошибка при освобождении памяти
Посмотрите здесь:

Ошибка при освобождении памяти? C++
Ошибка при освобождении памяти C++
Ошибка при освобождении памяти C++
Ошибка при освобождении памяти C++
C++ Ошибка при освобождении памяти массива string
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
26.10.2011, 09:10     Ошибка при освобождении памяти #2
Цитата Сообщение от GBIT
C++
1
TableH[i]="-1";
используй strcpy()
GBIT
 Аватар для GBIT
11 / 11 / 1
Регистрация: 05.10.2011
Сообщений: 219
26.10.2011, 15:33  [ТС]     Ошибка при освобождении памяти #3
да да. все верно. при использовании
Цитата Сообщение от accept Посмотреть сообщение
strcpy()
все отлично освобождается.

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

C++
1
2
3
...
    char **TableH = new char* [n];
...
не знаю поможет ли, попробуй
C++
1
char* TableH[] = new char* [n]
-=ЮрА=-
Заблокирован
Автор 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;
}
GBIT
 Аватар для GBIT
11 / 11 / 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] - это та память, что мы освободили
или все же бред написал?
-=ЮрА=-
Заблокирован
Автор FAQ
26.10.2011, 16:41     Ошибка при освобождении памяти #7
ох и кучу всего написал-
Удаление идёт ступенчато, каждый раз удаляется последняя строка в текстовом блоке TableH...

Не по теме:

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

ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
26.10.2011, 16:41     Ошибка при освобождении памяти #8
GBIT,
C++
1
 if(TableH[i]="-1")
неправильно.

C++
1
if (!strcmp(TableH[i], "-1"))
правильно.
-=ЮрА=-
Заблокирован
Автор 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";
HighPredator
 Аватар для HighPredator
5347 / 1730 / 320
Регистрация: 10.12.2010
Сообщений: 5,112
Записей в блоге: 3
26.10.2011, 16:57     Ошибка при освобождении памяти #10
Цитата Сообщение от GBIT Посмотреть сообщение
C++
1
if(TableH[i]="-1") cout<<"(none)";
У вас идет присвоение, а не сравнение.
GBIT
 Аватар для GBIT
11 / 11 / 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")
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,511
26.10.2011, 16:59     Ошибка при освобождении памяти #12
GBIT, у меня Ваш код работает и так нормально (компилятор - minigw).
Хотя вот это лучше исправить
C++
1
2
        for(i=0;i<n;i++)
                TableH[i]="-1";
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
26.10.2011, 17:04     Ошибка при освобождении памяти #13
Да не надо указателям присваивать указатели. Зачем несколько указателей на одну область памяти? Надо копировать и записывать в область памяти.
GBIT
 Аватар для GBIT
11 / 11 / 1
Регистрация: 05.10.2011
Сообщений: 219
26.10.2011, 17:12  [ТС]     Ошибка при освобождении памяти #14
Цитата Сообщение от ForEveR Посмотреть сообщение
Зачем несколько указателей на одну область памяти?
это я не указатели делал. просто инициализировал значением весь массив строк.

потом то и применялся
C++
1
2
if (!strcmp(TableH[i], "-1"))
        cout<<"(none)";  // мол строка пустая и в нее еще ничего не вписывали.
-=ЮрА=-
Заблокирован
Автор FAQ
26.10.2011, 17:19     Ошибка при освобождении памяти #15
Gepar, у
GBIT, стоит скорее всего Visual Studio и то что прокатит в MinGW может не прокатить в студии, например в студии нет Variable Length Array
GBIT, мне сложно рассказать ещё доступней - доступней так выделив память у вас в руках появился портфель, и тут вы хотите его постепенно сжечь, вы пережгли ручку и портфель упал на замлю и доступа к нему уже нет, другое дело если вы подожжёте портфель со стороны дна, так же и с массивом
Цитата Сообщение от GBIT Посмотреть сообщение
if(TableH[i]=="-1")
- это неверно, строки сравниваются как и сказал
ForEveR, strcmp
После выделения памяти в массив вы ничего не записали, тогда откуда надеетесь в строке хоть один символ для сравнения найти - она же ещё пуста...
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
26.10.2011, 17:21     Ошибка при освобождении памяти #16
-=ЮрА=-, Я ни на что не надеюсь. Я говорю что стоит использовать strcpy/strncpy для копии. strcmp/strncmp для сравнения.
-=ЮрА=-
Заблокирован
Автор FAQ
26.10.2011, 17:35     Ошибка при освобождении памяти #17
Цитата Сообщение от ForEveR Посмотреть сообщение
Я ни на что не надеюсь.
- к чему это???
Я и так сказал
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
строки сравниваются как и сказал
ForEveR, strcmp
Кстати для копии также можно использзовать sprinf. Или мне тут все антогонирует даже когда слово одобрения сказал?
ForEveR
26.10.2011, 17:39
  #18

Не по теме:

-=ЮрА=-, Я неправильно понял сообщение. Ссори.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.10.2011, 18:30     Ошибка при освобождении памяти
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
GBIT
 Аватар для GBIT
11 / 11 / 1
Регистрация: 05.10.2011
Сообщений: 219
26.10.2011, 18:30  [ТС]     Ошибка при освобождении памяти #19
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
стоит скорее всего Visual Studio
все верно -=ЮрА=-, vs 2010 ultimate

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
После выделения памяти в массив вы ничего не записали, тогда откуда надеетесь в строке хоть один символ для сравнения найти - она же ещё пуста...
как это я ничего туда не записал?
а как же цыкл
C++
1
2
for(i=0;i<n;i++)
                TableH[i]="-1";
который я потом переделал на
C++
1
2
for(i=0;i<n;i++)
                strcpy(TableH[i],"-1")

* * *
ну и в целом резюмируя все выше сказанное.
• понял что работать со строками нужно через функции str
• для освобождения памяти от массива
C++
1
2
3
4
5
6
7
8
char **TableH = new char* [n];
        for(i=0;i<n;i++)
                TableH[i] = new char[32];
/*for(i=0;i<n;i++)
{
    delete [] TableH[i];
}*/
delete [] TableH;
достаточно последней строки.
Yandex
Объявления
26.10.2011, 18:30     Ошибка при освобождении памяти
Ответ Создать тему
Опции темы

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