![]() |
|
Модераторы: bsa Страницы: (7) Все « Первая ... 2 3 [4] 5 6 ... Последняя »
( Перейти к первому непрочитанному сообщению ) |
![]()
|
|
| baldina |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
сделав обертки, мы получили те же самые malloc и free, концептуально ничего нового. в вопросах управления ресурсами, в т.ч. памятью, важно понятие владельца. именно владелец отвечает за своевременное удаление объекта (освобождение ресурса). выделение ресурса может происходить вне владельца, важно, что бы сразу после выделения установить владельца. на примере умных указателей:
здесь выделение ресурса происходит вне владельца - переменной my_ptr, но владелец устанавливается сразу. освобождение памяти произойдет, кода закончится время жизни my_ptr. если между выделением ресурса и установкой владельца что-то происходит
есть вероятность возникновения исключения, тогда память не будет освобождена. |
||||||
|
|||||||
| Kruger2 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 94 Регистрация: 9.1.2011 Репутация: нет Всего: нет |
В общих чертах я это понимаю. Теорию из книги прочитал, теперь пытаюсь перенести теорию на практику.
Если я вас правильно понял, мне не нужно освобождать память по окончанию выполнения функции, т.к. локальная переменная сама сотрется при выходе из функции? Хорошо, тогда правильно ли я вызываю функцию динамического распределения памяти? Внутри функции, которая оперирует интересующими меня переменными я вызываю функцию выделения памяти, т.е. всё верно? Потому что я сомневался, может я в мейне должен вызвать функцию malloc(inMemory) перед началом выполнения двух других функций, но это получается нелогичным, т.к. память выделиться на все последующие функции и захламится мусором этих самых функций и при этом не произойдет очистки памяти. Верно? |
|||
|
||||
| baldina |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
Kruger2, тут какая-то каша в коде.
давай вернемся к задаче. требуется написать управление памятью и доступом для квадратной матрицы. определим операции 1. создать матрицу порядка N 2. получить доступ (для чтения или установки значения) к элементу (i,j) матрицы 3. освободить занимаемую матрицей память пусть у нас будет
предлагаю структуру сделать такой:
тогда data должен указывать на память размером size*size, а элемент (i,j) в data находится по индексу i*size+j остальное, думаю, сам реализуешь. ЗЫ: с использованием классов это можно сделать намного изящнее Добавлено через 3 минуты и 14 секунд
совсем не вызываешь это не вызов, а объявление |
||||||
|
|||||||
| Kruger2 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 94 Регистрация: 9.1.2011 Репутация: нет Всего: нет |
Это зря, структуры не изучал ещё. Совершенно непонял Матрица у меня уже есть, зачем мне её ещё раз создавать, зачем мне функция получения значения элемента? Брр, стало только хуже. Я хоть немного понимал, что я и как делаю. У меня была задача состоящая из двух функций, по идее мне достаточно было выделить память под эти две функции, что бы решить новое задание. Но теперь весь код каша? А в каком месте то каша? сейчас есть 4 функции, 2 из них решают основное задание, а 2 другие это выделение памяти и очистка. Вроде до каши ещё далеко |
|||
|
||||
| baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
локальная сотрется, а то что было выделено при помощи malloc - нет. что бы динамическое распределение происходило так же просто и естественно, как это делается для локальных переменных, потредуется класс, в конструкторе которого выделяешь память, а в деструкторе освобождаешь.
Добавлено через 4 минуты и 52 секунды
ок, зайдем с другого конца. вот зачем: что бы разделить задачу на части, упростить её. сейчас имеешь сотню строк кода, сильно связанного между собой. а будешь иметь ту же сотню, но в отдельных функциях, каждая - неск. строк, совершенно независимых. допустим, структуры еще не изучал. классы тем более. давай обойдемся тем что есть. 1. вместо структуры будем использовать две переменные - указатель на выделяемую память и порядок матрицы. я предлагаю использовать одномерный массив для матрицы. это гораздо проще в выделении памяти, а лдя доступа будем использовать очень простую функцию Это сообщение отредактировал(а) baldina - 11.7.2011, 15:27 |
||||
|
|||||
| Kruger2 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 94 Регистрация: 9.1.2011 Репутация: нет Всего: нет |
Неужели нельзя в рамках моей программы выделить память, без подключения структур? Я до них ещё не добрался.
Мда, тут вызвать никак не получается При попытке вызвать функцию посредством inMemory (b) пишет expected primary-expression before ')' token, что за праймери экспрешен?( |
|||
|
||||
| baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
посмотри что получилось: теперь все операции с матрицей мы можем осуществлять через эти (очень простые) функции. можешь добавить проверки выхода индексов за границы. можешь добавить отладочную печать. на вызывающий код это не повлияет. Добавлено через 1 минуту и 28 секунд
ну вообще-то у тебя в программе b определена как int, а inMemory требует int** |
||||
|
|||||
| Kruger2 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 94 Регистрация: 9.1.2011 Репутация: нет Всего: нет |
даже функцию блин вызвать не могу)
|
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
Kruger2, тут две проблемы: пока ты не очень ориентируешься в языке и стараешься решить задачу целиком. первое подтянешь, со вторым я тебе сейчас помогаю.
|
|||
|
||||
| Kruger2 |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 94 Регистрация: 9.1.2011 Репутация: нет Всего: нет |
Мы будто говорим каждый сам с собой
Меня интересует в первую очередь два вопроса. Верны ли сами функции inMemory и freeMemory и будет ли верным такой вызов?
Добавлено через 1 минуту и 59 секунд baldina, Да я вроде литературу читаю, простые задачи решаю, но как то ориентироваться лучше не начинаю. Хоть бери об стенку убейся, как только появляется задание выходящее за рамки того что описано в книге, я словно пытаюсь по китайски заговорить:*( Добавлено через 6 минут и 14 секунд Вообщем то тоже неверно, программа рушится Добавлено через 7 минут и 59 секунд Но у меня то двумерная матрица Добавлено через 14 минут и 34 секунды Ладно. Пробую разобраться:
get_m помоему все таки лишняя, разве нет? у меня ведь объявлена матрица, получается я работаю не с ней, а с той что тут будет создана void_st //функция установки значения элемента, вообще не понимаю что за установка значения. мы же не рандомную матрицу создаем. create matrix создает одномерный массив, тут кажись вся моя функция с проверкой должна подходить, нет?
а destroy_matrix вроде как должна подходить моя же функция? |
||||||
|
|||||||
| baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
по правде говоря, она не совсем правильная. мне показалось проще и быстрее перейти к обсуждению моего варианта, чем ковыряться в адресах и звездочках. по порядку. 1. что такое многомерный массив в С/С++? это одномерный массив, строки которого расположены последовательно в памяти (ничего необычного, ведь компьютерная память одномерная). Именно такое расположение я и предлагаю. Это проще для восприятия, чем "массив массивов". 2. неважно, что как расположено. мы пользуемся определенным интерфейсом - функциями create, get, set... Этот подход нам позволяет в процессе решения конкретной задачи не вникать в устройство массива, а в процессе проектирования интерфейсных функций не думать о всей задаче. поэтому get_m не лишняя. технически можно без нее обойтись, можно вообще все написать в единственной функции и в одну строчку, но с точки зрения грамотного проектирования и удобства использования она нужна. 3. ну поскольку она в итоге вызывает тот же malloc, то примерно да. точнее, если взять мою функцию и добавить туда проверки и сообщения, будет 'правильная' версия Kruger2 теперь рассмотрим
здесь есть две основные проблемы 1. параметры в С/С++ передаются по значению, поэтому если нужно инициализировать int**, то передавать приходится int***
2. К выделенному таким образом массиву нельзя обращаться A[i][j], т.к. элементы массива теперь не расположены последовательно. нужно так: (A[i])[j]; уже не так красиво, как раньше, правда? |
||||
|
|||||
| Kruger2 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 94 Регистрация: 9.1.2011 Репутация: нет Всего: нет |
Всё равно ни черта не понимаю. Пойду ещё искать литературу.
Добавлено через 7 минут и 24 секунды Вот я копировал отсюда, немнго меняя под себя. получается тут неправильный код выложили?)
|
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
Kruger2, есть простой выход. вообще он не очень хороший, но в данном случае наверно лучший.
сделай
|
|||
|
||||
| Kruger2 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 94 Регистрация: 9.1.2011 Репутация: нет Всего: нет |
так? |
|||
|
||||
| voral |
|
||||||||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 16.3.2008 Где: Иваново Репутация: нет Всего: нет |
Во первых вы ни как не используете эту память, по-этому я не могу сказать где вам надо. В данном случае правильный ответ: "нигде ни выделять ни освобождать". Во вторых у вас все неправильно. Давайте прочитаем по русски этот код:
обявляем две переменные типа int. пытаемся объявить (не вызвать) функцию, которая в качестве аргумента принимает указатель на указатель на переменную типа int пытаемся объявить (не вызвать) функцию, которая в качестве аргумента принимает указатель на указатель на переменную типа int Все не более. Отбрасываем ошибку, с попыткой объявить функцию
Опять не увязка: 1 ваша процедура ждет указатель на указатуль...... 2 Места для переменных типа int уже зарезервированы, и нет смысла выделять память (а еслибы все же нужно было то надо было писать "&b" Правим
Теперь все, вроде так. Но! Вызывая inMemory(b) ; вы в конечном итоге инициализируете переменную b, адресом массива указателй переменная c при этом неинициализирована! А вы хотите освободить память по адресу хранящемуся в этой переменной!!! Ноона ни чего не содержит! Еще раз правим.
Вот теперь вы память выделили, а потом освободили. Осталось придумать зачем она вам тут сдалась... В данной задаче единственное применение для этих функций. Зарезервировать место под матрицу; заполнить ее программно (сейчас у нас это константа); найти решение; освободить память.. Т.е. по сути, это должно быть в main
Если вы где то зарезервировали память, то вы обязаны ее освободить - иначе "утечка памяти". То, о чем я вам говори касается лишь освобождения памяти под автоматическую переменную хранящую адрес выделенной вами памяти. Это сообщение отредактировал(а) voral - 11.7.2011, 17:34 |
||||||||||||
|
|||||||||||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |