Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
14 / 14 / 5
Регистрация: 05.10.2011
Сообщений: 223
1

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

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

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

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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.10.2011, 08:59
Ответы с готовыми решениями:

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

Ошибка при освобождении памяти
Здравствуйте, программа завершает работу в этом коде #include &lt;iostream&gt; #include &lt;ctime&gt;...

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

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

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

вот только у меня есть допустим:
C++
1
2
if(TableH[i]="-1")
     cout<<"(none)";
и этот if уже становится НЕ рабочим...
0
93 / 69 / 22
Регистрация: 17.10.2011
Сообщений: 235
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
14 / 14 / 5
Регистрация: 05.10.2011
Сообщений: 223
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
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
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
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
26.10.2011, 16:57 10
Цитата Сообщение от GBIT Посмотреть сообщение
C++
1
if(TableH[i]="-1") cout<<"(none)";
У вас идет присвоение, а не сравнение.
0
14 / 14 / 5
Регистрация: 05.10.2011
Сообщений: 223
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
1186 / 542 / 78
Регистрация: 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
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
26.10.2011, 17:04 13
Да не надо указателям присваивать указатели. Зачем несколько указателей на одну область памяти? Надо копировать и записывать в область памяти.
0
14 / 14 / 5
Регистрация: 05.10.2011
Сообщений: 223
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
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
26.10.2011, 17:21 16
-=ЮрА=-, Я ни на что не надеюсь. Я говорю что стоит использовать strcpy/strncpy для копии. strcmp/strncmp для сравнения.
0
Заблокирован
Автор FAQ
26.10.2011, 17:35 17
Цитата Сообщение от ForEveR Посмотреть сообщение
Я ни на что не надеюсь.
- к чему это???
Я и так сказал
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
строки сравниваются как и сказал
ForEveR, strcmp
Кстати для копии также можно использзовать sprinf. Или мне тут все антогонирует даже когда слово одобрения сказал?
1
ForEveR
26.10.2011, 17:39
  #18

Не по теме:

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

0
14 / 14 / 5
Регистрация: 05.10.2011
Сообщений: 223
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;
достаточно последней строки.
0
26.10.2011, 18:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.10.2011, 18:30
Помогаю со студенческими работами здесь

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

Ошибка при освобождении памяти
Задача: Из стандартного входного потока вводятся сроки. Признаком завершения каждой сроки является...

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

Ошибка при освобождении памяти
Условие задачи: В текстовом файле посчитать количество строк, а также для каждой отдельной строки...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru