Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
6 / 3 / 3
Регистрация: 15.11.2018
Сообщений: 20

Выделение и освобождение динамической памяти в функциях

15.11.2018, 20:56. Показов 1941. Ответов 5

Студворк — интернет-сервис помощи студентам
Каким образом происходит выделение и очистка динамической памяти для массивов (в частности) в функциях?
Написал код, но почему то ошибка нарушения доступа чтения из за cout в функции ShowArr. Насколько я понял в функциях FillDynArr() и delDynArr() создается копия указателя на указатель? Как вообще в с++ инициализируют и удаляют динамические массивы через функции?
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
#include "pch.h"
#include <iostream>
#include <stdlib.h>
#include <cmath>
#include <string>
using namespace std;
//template <typename arrType>
void FillDynArr(double **arr, const int size1, const int size2) {
    
    arr = new double*[size1];
 
    for (int i = 0; i < size1; i++) {
        arr[i] = new double[size2];
    }
    for (int i = 0; i < size1; i++) {
        for (int j = 0; j < size2; j++)
            arr[i][j] = rand() % 10;
    }
    
}
void ShowArr(double** a, int s1, int s2) {
    for (int i = 0; i < s1; i++) {
        for (int j = 0; j < s2; j++)
            cout << a[i][j] << " ";
        cout << endl;
    }
    cout << endl;
}
void delDynArr(double **a, int s, int b) {
    for (int i = 0; i < s; i++)
        delete[] a[i];
 
    delete[] a;
    a = nullptr;
}
int main()
{
    int a = 5;
    int b = 10;
    double **dynArrD=nullptr;
    
    FillDynArr(dynArrD, a, b);
    ShowArr(dynArrD, a, b);
    delDynArr(dynArrD, a, b);
    FillDynArr(dynArrD, a, b);
    ShowArr(dynArrD, a, b);
 
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.11.2018, 20:56
Ответы с готовыми решениями:

Освобождение и выделение динамической памяти
Привет народ, такой вопрос: Допустим в main, указателю выделил память, всё разумеется нормально, читаю пишу всё ок, потом передал этот...

Освобождение динамической памяти
После первого вызова функции(при повторном) пишет ошибку. В функции sort один из элементов массива становится недоступным для чтения. Если...

Освобождение динамической памяти
Здравствуйте! Была задача реализовать сложение длинных чисел с помощью стеков. Сам стек реализовал просто, но всё же проблемы есть -...

5
 Аватар для Drodoz
33 / 21 / 13
Регистрация: 31.10.2018
Сообщений: 51
15.11.2018, 21:12
Лучший ответ Сообщение было отмечено Vasilly как решение

Решение

При передаче указателя в функцию создается его копия, то есть вот это
Цитата Сообщение от Vasilly Посмотреть сообщение
a = nullptr;
никак не повлияет на указатель вне функции.

Если вы хотите изменить сам указатель, то нужно передать его по ссылке:
C++
1
void delDynArr(double** &a, int s, int b)
Указатель можно воспринимать как обычную переменную, содержащую число, то есть адрес другой переменной в памяти. Через указатель можно взаимодействовать с другими переменными. Создание динамических переменных подразумевает присваивание указателю адрес этой переменной и "зарезервирование" области памяти. Это значит, что при создании новых динамических переменных эта память не будет использоваться, потому что она уже занята другой переменной. Удаление же сообщает компилятору, что эта область памяти больше нам не нужна и ее можно использовать для других переменных.
0
 Аватар для all_this_pain
45 / 30 / 16
Регистрация: 25.02.2017
Сообщений: 103
15.11.2018, 21:17
Здесь адрес выделенной памяти записывается в локальную переменную arr (фактические параметры функции являются ее локальными переменными с соответствующей областью видимость):
C++
1
arr = new double*[size1];
Если вы хотите выделять память в функции, то просто возвращайте этот указатель:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
double** FillDynArr(const int size1, const int size2) {
    double **arr = new double*[size1];
    for (int i = 0; i < size1; i++) {
        arr[i] = new double[size2];
        for(int j = 0; j < size2; j++) {
            arr[i][j] = rand() % 10;
        }
    }
    return arr;
}
 
int main() {
    //...
    double **dynArrD = nullptr;
    dynArrD  = FillDynArr(a, b);
    //...
}
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
15.11.2018, 21:28
Цитата Сообщение от Vasilly Посмотреть сообщение
Каким образом происходит выделение и очистка динамической памяти для массивов (в частности) в функциях?
лучше по принципу в функции выделил - в функции освободи ( речь идёт об одной функции ). и там ничего не чистится, просто память освобождается для использования другими процессами.
0
475 / 427 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
15.11.2018, 21:33
Цитата Сообщение от Yetty Посмотреть сообщение
лучше по принципу в функции выделил - в функции освободи ( речь идёт об одной функции ). и там ничего не чистится, просто память освобождается для использования другими процессами.
Полегче, полегче, куча не такая щедрая, чтобы своей памятью делиться с другими процессами, пока счетчик в 0 не тикнет.
0
6 / 3 / 3
Регистрация: 15.11.2018
Сообщений: 20
15.11.2018, 21:50  [ТС]
Спасибо, работает.
А как будет правильнее делать все таки: передавать указатель по ссылке или возвращать значение указателя через функцию
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.11.2018, 21:50
Помогаю со студенческими работами здесь

Освобождение динамической памяти в vs
Вообщем попался я тут, и так, код: //#define _CRT_SECURE_NO_WARNINGS добавить в vs #include &lt;iostream&gt; #include...

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

Освобождение динамической памяти из-под прямоугольной матрицы
Добрый вечер! При попытке очищения памяти после завершения работы программы с прямоугольной матрицей m на n мне выдаёт ошибку а-ля...

Выделение и освобождение памяти
В моей программе есть следующий код: char* lexems; // массив указателей на символ char* lexem; // вспомогательная...

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru