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

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

Войти
Регистрация
Восстановить пароль
 
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 113
#1

Как правильно записать в виде функции выделение памяти для двумерного массива и ее освобождение - C++

06.05.2014, 21:12. Просмотров 499. Ответов 9
Метки нет (Все метки)

Здравствуйте! Подскажите, как правильно записать в виде функции выделение памяти для двумерного массива и ее освобождение.

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
//------------------------Выделение памяти------------------------------------
    int **mas = new int *[k];
 
    for (int i = 0; i < k; i++) {
      mas[i] = new int [m];
    }
 
 
 
    cout << "Enter matrix elements:";
    cout << endl;
 
    for (i=0; i<k; i++)//Заполняем массив
        {
        for (j=0; j<m; j++)
            {
                cout<<"Enter element ["<<i<<"]["<<j<<"] : ";
                cin>>mas[i][j];
            }   cout<<endl;
        }
 
    cout <<"Your matrix:"<<endl;
 
    for(i=0; i<k; i++)//Выводим сам массив
        {
            for(j=0; j<m; j++)
            {
                cout <<mas[i][j] <<"\t";
            }
 
            cout << endl;
        }
 
    //--------------------------Освобождение памяти----------------------------
    for (int i = 0; i < k; i++) {
      delete []mas[i];
    }
    delete []mas;
    mas = NULL; // Обнуление массива
Добавлено через 3 минуты
Для выделения:
C++
1
2
3
4
5
6
7
8
9
int** Allocation(int k, int m)
{        
        int **mass = new int *[k];
        for (int i = 0; i < k; i++) 
        {
             mass[i] = new int [m];  
        }
        return mass;
}
Добавлено через 5 минут
Помогите, пожалуйста, для освобождения.

Добавлено через 3 минуты
И вообще, скажите, правильно ли оно выделяет и освобождает память, а то я не знаю как на практике проверить.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.05.2014, 21:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как правильно записать в виде функции выделение памяти для двумерного массива и ее освобождение (C++):

Динамическая загрузка и освобождение памяти для двумерного массива - C++
Всем добрый день:victory: У меня возник небольшой вопрос , и надеюсь что отзывчивые форумчане 8-) помогут мне с ним разобраться. ...

Выделение динамической памяти для двумерного массива. - C++
#include &lt;iostream&gt; int main() { setlocale( LC_ALL,&quot;Russian&quot; ); int N, M; std::cout &lt;&lt; &quot;Введите кол-во строк в массиве:...

Динамическое выделение памяти для двумерного массива - C++
нужна помощь вот тело программы, не могу сделать динамическое выделение памяти для первого двумерного массива. второй массив получается...

Выделение и освобождение памяти для локальных переменных функций - C++
Привет Столкнулся со следующей проблемой. Написал простенькое приложение: читаем 1 строку из файла на диске, записываем 1 строку в файл...

Выделение памяти для двухмерного массива внутри функции - C++
Здравствуйте. Предположим, есть код: #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;cstdlib&gt; #include &lt;time.h&gt; using...

резервирование памяти/освобождение памяти для трехмерного массива - C++
Необходимо создать трехмерный массив (A), в котором элементы вдоль направления Z выли бы выровнены по 16 байт. Есть две проблемы: ...

9
nmcf
5682 / 4993 / 1701
Регистрация: 14.04.2014
Сообщений: 20,369
06.05.2014, 21:22 #2
Аналогично:
C++
1
2
3
4
5
    for (int i = 0; i < k; i++) 
        {
             delete[] mass[i];  
        }
    delete[] mass;
0
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 113
06.05.2014, 21:38  [ТС] #3
Так то да... Если Вы прокрутите первый код, то это увидите. Я не знаю как создать функцию таким образом и что она должна возвращать.

Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
10
int** FREE(int k, int m)
{        
       for (int i = 0; i < k; i++)
       {
           delete []mas[i];
       }
       delete []mass;
       mas = NULL; // Обнуление массива
       return mass;
}
Так?
0
nmcf
5682 / 4993 / 1701
Регистрация: 14.04.2014
Сообщений: 20,369
06.05.2014, 21:40 #4
Ничего не надо возвращать, просто void. Для чего ты NULL присваиваешь? Просто для себя?
1
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 113
06.05.2014, 21:58  [ТС] #5
C++
1
2
3
4
5
6
7
8
9
void FREE(int k, int m)
{        
       for (int i = 0; i < k; i++)
       {
           delete []mas[i];
       }
       delete []mass;
       mas = NULL; // Обнуление массива
}
где-то читал, что NULL присваиваь это что-то вроде правила хорошего тона.

Добавлено через 5 минут
Функция то правильная?
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
06.05.2014, 22:01 #6
Цитата Сообщение от Donville Посмотреть сообщение
что NULL присваиваь это что-то вроде правила хорошего тона.
когда указатель за время своей жизни используется несколько раз для выделения/освобождения памяти, то действительно после освобождения памяти (delete) хорошо присвоить указателю NULL (nullptr) дабы исключить ситуацию со случайным повторным освобождением памяти и не нужно иметь дополнительный признак того, что память освобождена.

Добавлено через 47 секунд
Цитата Сообщение от Donville Посмотреть сообщение
Функция то правильная?
аргумент m лишний.
1
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 113
06.05.2014, 22:12  [ТС] #7
Скажите, как на практике проверить, что память выделилась и освободилась?
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
06.05.2014, 22:19 #8
Цитата Сообщение от Donville Посмотреть сообщение
что память выделилась и освободилась?
если new вернул ненулевой указатель, то память выделилась.
если в delete передать правильный указатель, то освобождение будет выполнено, никаких ошибок быть не должно.
1
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 113
06.05.2014, 22:37  [ТС] #9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int** Allocation(int k, int m)
{
        int **mas = new int *[k];
        for (int i = 0; i < k; i++)
        {
             mas[i] = new int [m];
        }
        return mas;
}
 
 
void Deallocation(int k)
{
       for (int i = 0; i < k; i++)
       {
           delete []mas[i];
       }
       delete []mas;
       mas = NULL; // Обнуление массива
}
Ругается: 'mas' was not declared in this scope (строки 16 и 18).
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
06.05.2014, 22:47 #10
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Donville Посмотреть сообщение
Ругается: 'mas' was not declared in this scope (строки 16 и 18).
Логично. Внутри Deallocation() не объявлен mas.
Сделайте так в 12 строке:
C++
1
void Deallocation(int **mas, int k)
и при вызове передавайте первый аргументом то, что вернул Allocation.
1
06.05.2014, 22:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.05.2014, 22:47
Привет! Вот еще темы с ответами:

Выделение-освобождение памяти - C++
Добрый день. Написал заготовку под программу. Возник вопрос: правильно ли выделяю-освобождаю память? Программа работает корректно, но...

Освобождение и выделение памяти - C++
Помогите разобраться с программой, где здесь выделение памяти (как я понял это new) и где освобождение памяти. #include &lt;iostream&gt; ...

Выделение и освобождение памяти - C++
Доброго времени суток. Пишу класс по ООП, и назрел один вопрос, связанный с моментом выделения и освобождения памяти. class SOK { ...

Выделение и освобождение памяти в c++ - C++
Не давно наткнулся на такую замечательность : system(&quot;PAUSE&quot;);//1 раз int *p = new int; // память system(&quot;PAUSE&quot;);//2 раз ...


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

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

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