|
0 / 0 / 0
Регистрация: 25.07.2020
Сообщений: 36
|
||||||||||||||||
Функция принимает указатель на динамический массив переданный другой функцией. Как правильно освободить память?25.07.2020, 05:08. Показов 1399. Ответов 5
Подскажите, пожалуйста, начинающему!
Есть функция-член в одном классе, которая создаёт при помощи new динамический массив (скажем размерности [2], хотя это частный случай) и возвращает в др. функцию friendly класса. Во втором классе есть массив размерности [2] с корректным типом значений (таким же как в отдающей функции) Вторая функция принимает указатель на массив и с его помощью присваивает значения фиксированному по размеру массиву своего класса. Для этого в main() сначала создаётся объект первого класса "Deck" т.е. колода на 52 карты, потом создаётся объект "Hand" т.е. "рука" игрока на 2 карты и выделенный в тексте листинга main вызов функции gethand() (объекта класса hand) получает указатель от функции DrawXCards объекта "Deck" и по указателю заполняет [2] массив данных своего объекта. (Может путанно объяснил, но не знаю как проще). Как и когда в таком случае правильно освободить память с помощью delete[] занятую созданным динамическим массивом и чем чревато, если этого не сделать? Память остаётся занятой даже после выхода из программы? Просто получается, что отдающая функция уже отработала и закрылась, а принимающая по полученному указателю заполнила значения массива своего объекта. А как и когда освободить память того созданного динамического массив на который пришёл указатель для заполнения никак не могу понять. Первый класс и передающая функция DrawXCards():
0
|
||||||||||||||||
| 25.07.2020, 05:08 | |
|
Ответы с готовыми решениями:
5
Функция принимает указатель на динамический массив и возвращает его же, но без чисел полиндромов (читается с обоих сторон одинаково - 234432) Ввести в динамический массив 100 вещественных чисел, вывести их в обратном порядке, освободить память
|
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|
| 25.07.2020, 06:09 | |
|
Здесь нужен объект-обертка аналогичный std::vector, который будет владеть динамическим массивом и подчищать его. Или сам std::vector.
Но я бы лучше предложил влепить в DrawXCards аргумент CARD* array, чтобы он выводил данные сразу в HAND. Без всех этих операций с динамической памятью.
1
|
|
|
0 / 0 / 0
Регистрация: 25.07.2020
Сообщений: 36
|
||
| 25.07.2020, 06:41 [ТС] | ||
|
По поводу аргумента CARD* array в DrawXCards вы имеете ввиду static массив на [2] элемента, который бы "висел" в памяти всю программу? Но как к нему получит доступ функция gethand() из класса Hand для заполнения своего массива? Он же, этот аргумент, получается будет статичной локальной переменной локализованной внутри функции DrawXCards!? Или имеется ввиду добавить аргумент в скобки функции DrawXCards в виде самого массива CARD[2] из объекта hand, который передаём по ссылке в DrawXCards и она его напрямую заполняет? Тогда я понимаю, но просто это решение годится, когда известна длина массива т.е. сколько элементов в него копировать из объекта Deck. И потом нарушается иерархия построения классов. Получается не класс Hand вытаскивает себе карты из Deck, а наоборот класс Deck из которого тянутся карты "лезет" своей функцией напрямую в соответствующий массив класса hand, в который эти карты должны попадать. Или я чего то не понимаю. Можно поподробней, я не очень понял, где должен быть данный аргумент и как он будет передаваться в массив размера [2] объекта класса Hand. И потом это получается не универсальное решение, потому что вдруг мы захотим "вытащить" из колоды не 2 карты а 3 или 4 и запихнуть уже в объект другого класса с массивом данных бОльшей размерности того же класса Card. А нельзя ли в main создать промежуточный указатель типа CARD* ptr, затем присвоить ему возврат функции DrawXCards, потом вызвать hand1.gethand(ptr), чтоб заполнить массив, который находится в hand1, потом все нужные действия и в конце сделать просто delete[] ptr; ? Это не очистит динамическую память?
0
|
||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||||||||||||||
| 25.07.2020, 06:53 | ||||||||||||||
Сообщение было отмечено realalexandro как решение
Решение
0
|
||||||||||||||
|
0 / 0 / 0
Регистрация: 25.07.2020
Сообщений: 36
|
|||
| 25.07.2020, 07:16 [ТС] | |||
|
класса Deck и "тянет" из него карты с нужными номерами по индексам. Одно уточнение. А что за тип "size_t" pos (почему просто int не использовать, это же параметр стартового индекса массива с которого начинаем операцию?) и зачем добавлять указатель на пространство имён если в самом начале уже написано using namespace std; ? Я правда это сделал бы не в конструкторе, а в отдельной функции заполнения hand, поскольку в один объект hand будут в цикле много пар карт потом закидываться, - не создавать же каждый раз новый объект. Но всё равно спасибо огромное, что помогли! Но память то главное очищается таким образом? Я вот просто не понимаю, если под new[] не будет delete[], что собственно случится? Оперативка забьётся после окончания работы программы? Или в процессе работы только? Сорри, вопрос, наверное идиотский, но не знаю механизма просто...Ещё раз большое спасибо!
0
|
|||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|||
| 25.07.2020, 07:21 | |||
|
1
|
|||
| 25.07.2020, 07:21 | |
|
Помогаю со студенческими работами здесь
6
Как правильно освободить память
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|