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

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

Восстановить пароль Регистрация
 
y_e_p
 Аватар для y_e_p
3 / 3 / 0
Регистрация: 15.09.2013
Сообщений: 27
15.09.2013, 16:19     Правильное удаление динамического двумерного массива #1
Доброго времени суток форумчани.
Ну в общем перейду сразу к делу.
О себе: сам пишу на 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;
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.09.2013, 16:19     Правильное удаление динамического двумерного массива
Посмотрите здесь:

C++ Правильное удаление двумерного динамического массива ( нужен ли delete[] array )
C++ Правильное выдиление динамической памяти для двумерного массива
C++ Полное правильное описание двумерного массива
Удаление колонки (столбца) из динамического двумерного массива C++
C++ Удаление двумерного динамического массива из памяти
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
15.09.2013, 16:25     Правильное удаление динамического двумерного массива #2
Цитата Сообщение от y_e_p Посмотреть сообщение
Что я не так сделал.
Скорее всего где-то вылезли за пределы выделенной памяти.
Цитата Сообщение от y_e_p Посмотреть сообщение
объясните как именно использовать указатели.
Ну этот вопрос выходит за рамки одной темы на форуме, имхо.
Цитата Сообщение от y_e_p Посмотреть сообщение
Помогите с кодом
Если честно, режет в глазах из-за таких имен переменных - без бутылки не разберешься
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
15.09.2013, 16:31     Правильное удаление динамического двумерного массива #3
C++
1
2
3
4
5
6
 // Удаление массива
    for (int i = 0; i < n; i++)
    {
        delete[]Arr[i]; // Удаляем каждый элемент
    }
    delete [] Arr; // А потом массив
y_e_p
 Аватар для y_e_p
3 / 3 / 0
Регистрация: 15.09.2013
Сообщений: 27
15.09.2013, 16:38  [ТС]     Правильное удаление динамического двумерного массива #4
Я в коде так и прописал...но выкидывает ошибку(Правильное удаление динамического двумерного массива
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
15.09.2013, 16:39     Правильное удаление динамического двумерного массива #5
На первой же итерации первого вложенного цикла:

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

Наверняка, есть еще подобные ошибки.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
15.09.2013, 16:40     Правильное удаление динамического двумерного массива #6
Genn55, удаление в коде правильное. Скорее всего, там в спиралях где-то выход за пределы.
y_e_p
 Аватар для y_e_p
3 / 3 / 0
Регистрация: 15.09.2013
Сообщений: 27
15.09.2013, 16:40  [ТС]     Правильное удаление динамического двумерного массива #7
Croessmah, ну с переменными да,согласен,это моя ошибка, ну вот просто не могу отловить где именно оно выходит за границы массива, ведь программа все выводит правильно..и массив показывает, а вот когда надо удалить массив, начинает показывать код ошибки.
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
15.09.2013, 16:41     Правильное удаление динамического двумерного массива #8
Цитата Сообщение от 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? Локальная область видимости же ж. А если циклов много будет, тебе и букв не хватит все по разному называть

А проблемы у тебя в основном цикле - где то, как уже сказали, за пределы вылазишь и информацию и размере затираешь.. Выводи все индексы, которые там используются, и увидишь, где.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
15.09.2013, 16:47     Правильное удаление динамического двумерного массива #9
Цитата Сообщение от monolit Посмотреть сообщение
Смело удаляй, так делать нельзя....
Однако, возможно, хоть такое решение и не стандартно. А в данном случае эта строчка закоментирована.
y_e_p
 Аватар для y_e_p
3 / 3 / 0
Регистрация: 15.09.2013
Сообщений: 27
15.09.2013, 16:52  [ТС]     Правильное удаление динамического двумерного массива #10
Croessmah, это так, учусь методом проб и ошибок. Хочу понять указатели и массивы. Потом думаю будет легче.
monolit
179 / 179 / 21
Регистрация: 24.03.2011
Сообщений: 641
Завершенные тесты: 1
15.09.2013, 17:36     Правильное удаление динамического двумерного массива #11
Croessmah, n, m ведь не константы, а вводятся) так что в голову не приходит чего-то стандартного.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2013, 17:49     Правильное удаление динамического двумерного массива
Еще ссылки по теме:

Сортировка двумерного динамического массива C++
Удаление двумерного динамического массива MSVS C++
C++ Заполнение двумерного динамического массива

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

Или воспользуйтесь поиском по форуму:
y_e_p
 Аватар для y_e_p
3 / 3 / 0
Регистрация: 15.09.2013
Сообщений: 27
15.09.2013, 17:49  [ТС]     Правильное удаление динамического двумерного массива #12
Спасибо люди за помощь, действительно вышел за границы массива. Сейчас буду исправлять, так как после некоторых манипуляций программа успешно завершается и удаляет массив.
Yandex
Объявления
15.09.2013, 17:49     Правильное удаление динамического двумерного массива
Ответ Создать тему
Опции темы

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