Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
 Аватар для y_e_p
3 / 3 / 0
Регистрация: 15.09.2013
Сообщений: 27

Правильное удаление динамического двумерного массива

15.09.2013, 16:19. Показов 3908. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток форумчани.
Ну в общем перейду сразу к делу.
О себе: сам пишу на JAVA (android),решил взяться за С++,разбираюсь с указателями.
О IDE: Visual Studio 2012;
Проблема вот в чем, написал код,который заполняет двумерный массив по спирали. Вроде бы все работает,но при освобождении памяти вылетает. Что я не так сделал.
Просьба, сильно не пинайте,я только начал осваивать С++,даже понравилось, но немного проблема с указателями. Толком не могу понять зачем,как, и почему? Ну привык я к JAVA.
Помогите с кодом,и если не трудно объясните как именно использовать указатели.
Надеюсь я написал понятно проблему. Заранее благодарен Вам за помощь.
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
#include <iostream>
#include <stdlib.h>
#include <iomanip> 
 
using namespace std;
 
void main()
{
    setlocale(LC_ALL,"Russian");
    int n;
    int m;
    cout<<"Введите количество строчек:"<<endl;
    cin>>n;
    cout<<"Введите количество столбцов:"<<endl;
    cin>>m;
 
 
 
    //int Arr[n][m];
    int **Arr;
    Arr = new int*[n];
    for(int s=0;s<n;s++) Arr[s] = new int[m];
    int i=0, j = NULL, k = 0, p=0;
 
    while (i < n*m) /*Цикл по номеру витка*/
    {
        k++;
        for(j=m-k+1;j>=k-1;j--){
            Arr[k-1][j] = p++;
            i++;
            //cout<<Arr[k-1][j];
        }//top
        for(j=k;j<m-k+1;j++){
            Arr[j][k-1] = p++;
            i++;
            //cout<<Arr[j][k-1];
        }//left
        for(j=k;j<m-k+1;j++){
            Arr[m-k][j] = p++;
            i++;
            //cout<<Arr[m-k][j];
        }//bottom
        for(j=m-k-1;j>k;j--){
            Arr[j][m-k] = p++;
            i++;
            //cout<<Arr[j][m-k];
        } // right
 
 
    }
    cout << "Заполнение Массива по спирали"<< "\n" << endl;
    for (int q=0; q<n; q++)
    {
        for (int w=0; w<m; w++)
            cout << setw(4) << Arr[q][w];
        cout << endl;
 
    }
    //int *p = &m;
 
 
    //cin.get();
    system("pause");
 
 
    for(int x =0;x<n;x++) delete []Arr[x];
 
    delete []Arr;
 
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.09.2013, 16:19
Ответы с готовыми решениями:

Правильное удаление двумерного динамического массива ( нужен ли delete[] array )
В одном из постов форума Увидев код одного из участников форума: Я пришел в замешательство, когда мне сказали, что delete arr после...

Удаление двумерного динамического массива (матрицы)
Вот так я создаю двумерный динамический массив. bool **gameFieldArray; gameFieldArray = new bool*; for (int i = 0; i &lt; height;...

Удаление двумерного динамического массива из памяти
Допустим дан двумерный динамический массив (созданный с помощью new). Как правильно удалить его из памяти? У меня есть три варианта: ...

11
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
15.09.2013, 16:25
Цитата Сообщение от y_e_p Посмотреть сообщение
Что я не так сделал.
Скорее всего где-то вылезли за пределы выделенной памяти.
Цитата Сообщение от y_e_p Посмотреть сообщение
объясните как именно использовать указатели.
Ну этот вопрос выходит за рамки одной темы на форуме, имхо.
Цитата Сообщение от y_e_p Посмотреть сообщение
Помогите с кодом
Если честно, режет в глазах из-за таких имен переменных - без бутылки не разберешься
1
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
15.09.2013, 16:31
C++
1
2
3
4
5
6
 // Удаление массива
    for (int i = 0; i < n; i++)
    {
        delete[]Arr[i]; // Удаляем каждый элемент
    }
    delete [] Arr; // А потом массив
0
 Аватар для y_e_p
3 / 3 / 0
Регистрация: 15.09.2013
Сообщений: 27
15.09.2013, 16:38  [ТС]
Я в коде так и прописал...но выкидывает ошибку(
0
 Аватар для Schizorb
512 / 464 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
15.09.2013, 16:39
На первой же итерации первого вложенного цикла:

j = m-k+1 = m-1+1 = m - то есть выход за пределы (т.к. максимальный номер столбца = m-1).

Наверняка, есть еще подобные ошибки.
1
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
15.09.2013, 16:40
Genn55, удаление в коде правильное. Скорее всего, там в спиралях где-то выход за пределы.
1
 Аватар для y_e_p
3 / 3 / 0
Регистрация: 15.09.2013
Сообщений: 27
15.09.2013, 16:40  [ТС]
Croessmah, ну с переменными да,согласен,это моя ошибка, ну вот просто не могу отловить где именно оно выходит за границы массива, ведь программа все выводит правильно..и массив показывает, а вот когда надо удалить массив, начинает показывать код ошибки.
0
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
15.09.2013, 16:41
Цитата Сообщение от y_e_p Посмотреть сообщение
//int Arr[n][m];
Смело удаляй, так делать нельзя....
Цитата Сообщение от y_e_p Посмотреть сообщение
int i=0, j = NULL
А чем это j так выделилось?) если это число, то 0 и инициализируй.

Цитата Сообщение от y_e_p Посмотреть сообщение
system("pause");
Если на Ctrl+F5 запускать, это не нужно(в студии).

А так красивее:
C++
1
2
for(int x = 0;x<n;++x) delete[] Arr[x];
delete[] Arr;
ведь delete[] - оператор наряду с delete.
Да и int main() { ... return 0;} вроде лучше, тогда глядишь, может и по коду че понять можно, что за ошибка.

Цитата Сообщение от Croessmah Посмотреть сообщение
Если честно, режет в глазах из-за таких имен переменных - без бутылки не разберешься
Действительно, почему в циклах(всех) просто не использовать прижившиеся i, j? Локальная область видимости же ж. А если циклов много будет, тебе и букв не хватит все по разному называть

А проблемы у тебя в основном цикле - где то, как уже сказали, за пределы вылазишь и информацию и размере затираешь.. Выводи все индексы, которые там используются, и увидишь, где.
1
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
15.09.2013, 16:47
Цитата Сообщение от monolit Посмотреть сообщение
Смело удаляй, так делать нельзя....
Однако, возможно, хоть такое решение и не стандартно. А в данном случае эта строчка закоментирована.
0
 Аватар для y_e_p
3 / 3 / 0
Регистрация: 15.09.2013
Сообщений: 27
15.09.2013, 16:52  [ТС]
Croessmah, это так, учусь методом проб и ошибок. Хочу понять указатели и массивы. Потом думаю будет легче.
0
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
15.09.2013, 17:36
Croessmah, n, m ведь не константы, а вводятся) так что в голову не приходит чего-то стандартного.
0
 Аватар для y_e_p
3 / 3 / 0
Регистрация: 15.09.2013
Сообщений: 27
15.09.2013, 17:49  [ТС]
Спасибо люди за помощь, действительно вышел за границы массива. Сейчас буду исправлять, так как после некоторых манипуляций программа успешно завершается и удаляет массив.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.09.2013, 17:49
Помогаю со студенческими работами здесь

Удаление двумерного динамического массива MSVS
Здравия желаю. При работе с двумерными динамическими массивами столкнулся со странной ошибкой. Если попытаться удалять массив...

Удаление двумерного динамического массива символов
Программа разбивает строку на слова и записывает каждое слово по отдельности в двумерный динамический массив, чтоб потом сравнить. Когда в...

Корректное удаление двумерного динамического массива
Доброго времени суток. В программе имеется двумерный динамический массив. Особенность его в том, что часть строк имеет больше столбцов,...

Удаление колонки (столбца) из динамического двумерного массива
Сколько ни пытался, не смог понять/придумать как удалить столбец. Строка удаляется элементарно, но как это сделать со столбцом? 30 строка. ...

Полное правильное описание двумерного массива
#include&lt;iostream&gt; #include&lt;cstdlib&gt; #include&lt;ctime&gt; using namespace std; void vvod(int , int, int); void vvod(int f, int n, int...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru