Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2018, 10:21   #1
FerrariF70
Пользователь
 
Регистрация: 05.09.2017
Сообщений: 21
По умолчанию Массив указателей

Здравствуйте у меня вопрос на засыпку.

массив указателей на int в моём примере это двумерный массив получается.
почему когда при освобождении памяти я освобождаю только начало адреса массива и сразу освобождаются все строки и столбцы?

когда в массиве указателей на строки надо освобождать каждую строку по отдельности и только потом освободить адрес массива ? есть ли какая-то разница или может я что то не правильно делаю?

потому что я пробовал удалят интовые строки и он ругается сразу т.к одним махом всё удаляет а повторно удалит какую то не известную память он естественно не может т.к её не существует.
FerrariF70 вне форума Ответить с цитированием
Старый 04.04.2018, 10:34   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от FerrariF70 Посмотреть сообщение
массив указателей на int в моём примере это двумерный массив получается.
Нет. Получается массив указателей. Да с ним можно работать как с двумерным массивом, но...

Цитата:
Сообщение от FerrariF70 Посмотреть сообщение
почему когда при освобождении памяти я освобождаю только начало адреса массива и сразу освобождаются все строки и столбцы?
Не освобождаются. Вы просто потеряли указатели. Если вы отдали ключ от ворот во двор кому-то, то подъезды и квартиры не перестали существовать.

Цитата:
потому что я пробовал удалят интовые строки и он ругается сразу т.к одним махом всё удаляет а повторно удалит какую то не известную память он естественно не может т.к её не существует.
Потому что надо включать голову и делать по порядку - сначала удалять все, на что ссылаются указатели в массиве, а уж потом сам массив.
p51x вне форума Ответить с цитированием
Старый 04.04.2018, 18:49   #3
FerrariF70
Пользователь
 
Регистрация: 05.09.2017
Сообщений: 21
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Потому что надо включать голову и делать по порядку - сначала удалять все, на что ссылаются указатели в массиве, а уж потом сам массив
я же и написал что когда в случае строк всё удаляется по порядку с начало строки а затем сам массив. Но в этом примере у меня не получилось.


Код:
void realloc_arrays(int ***ListStudents, int index)
{
	static int size = 0;
	size = index;

	if (!(*ListStudents = (int **)realloc(*ListStudents, sizeof(int*) * (size+=1))))
		exit(1);

	if (!(*(*ListStudents + index) = (int *)malloc(sizeof(int) * 2)))
		exit(1);
}
наверно тут что то не правильно переопределяется?
FerrariF70 вне форума Ответить с цитированием
Старый 05.04.2018, 02:08   #4
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Это вообще бред сивой кобылы..
..вы в игры играете? Слышали про мульти-поточное ускорение и все такое вообще?
вот это
Код:
static int size = 0;
сводит все на нет.


Вобще, если есть желание заморачиватся с таким управлением памяти ручным, нужно делать доп. вещи типа

Код:
struct array_of_array
{
     size_t count;
     int   **data;
}
т.е. храним указатель и длину в кучке.

...и постепенно вы доизобретете std::vector (https://habrahabr.ru/company/infopulse/blog/194726/)

Последний раз редактировалось alexzk; 05.04.2018 в 02:23.
alexzk вне форума Ответить с цитированием
Старый 05.04.2018, 07:42   #5
FerrariF70
Пользователь
 
Регистрация: 05.09.2017
Сообщений: 21
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
struct array_of_array
{
size_t count;
int **data;
}
не понимаю в чём причина в моём коде что не так? вы дали пример не объяснив мой. Зачем мне хранить указатель в структуре когда я его просто посылаю по функциям куда мне надо не вижу смысла менять код.

и чем вас не устраивает этот вариант он статический инициализируется всего лишь один раз он всего то нужен для того что бы помнить предыдущий размер.
Код:
static int size = 0;

Последний раз редактировалось FerrariF70; 05.04.2018 в 07:45.
FerrariF70 вне форума Ответить с цитированием
Старый 05.04.2018, 08:03   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

А теперь прочитайте про потоки... Вы думаете их просто так упомянули?
p51x вне форума Ответить с цитированием
Старый 05.04.2018, 10:34   #7
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от FerrariF70 Посмотреть сообщение
не понимаю в чём причина в моём коде что не так? вы дали пример не объяснив мой. Зачем мне хранить указатель в структуре когда я его просто посылаю по функциям куда мне надо не вижу смысла менять код.

и чем вас не устраивает этот вариант он статический инициализируется всего лишь один раз он всего то нужен для того что бы помнить предыдущий размер.
Код:
static int size = 0;

У вас в кармане тел на 4 ядра, комп на 4-8 ядер и т.д. Все и везде с кучей ядер. А это означает, что вероятно, какието куски ваших программ будут исполнятся параллельно (т.е. одновременно). Т.о. даже учится писать вот такие статики в нынешнем мире не стоит. Просто запоминайте, как делать не нужно.
Ваша запись однозначно делает не возможным использование многих ядер.

Можно более понятно, а что, если вы захотите этой же функцией создать 2й массив иного размера? В принципе ф. принимая параметр позволяет это делать, но ваш статик делает ее конкретным решением конкретного случая, а не общим "выделятором памяти".

Код:
//внимание, задаем РАЗМЕР (т.е. индекс 0 = размер 1)
void realloc_arrays(struct array_of_array *descr, int size)
{
	while(size < descr->count)
           free(*(descr->data - 1+ descr->count--));	
        while(size > descr->count)
        {
               descr->data = (int **)realloc(descr->data, ++descr->count * sizeof(int*) )))
               *(descr->data + descr->count - 1) =  (int *)malloc(sizeof(int) * 2)));
        } 
}
Ну вот вам пример не самого оптимального использования. Не оптимально потому, что во 2 цикле будет 2 аллокации памяти вместо 1. Исправьте сами (realloc нужно вынести из цикла и делать 1 раз).

Последний раз редактировалось alexzk; 05.04.2018 в 10:49.
alexzk вне форума Ответить с цитированием
Старый 05.04.2018, 11:19   #8
FerrariF70
Пользователь
 
Регистрация: 05.09.2017
Сообщений: 21
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
(realloc нужно вынести из цикла и делать 1 раз
логично ибо будет утечка памяти. Теперь более понятно насчёт статического. Я всего лишь учусь по этому спрашиваю а тема указателей она обширная и не всегда понятная.
Спасибо большое!
FerrariF70 вне форума Ответить с цитированием
Старый 05.04.2018, 11:25   #9
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от FerrariF70 Посмотреть сообщение
логично ибо будет утечка памяти. Теперь более понятно насчёт статического. Я всего лишь учусь по этому спрашиваю а тема указателей она обширная и не всегда понятная.
Спасибо большое!
Не совсем, в моем коде нет утечки (ну...не должно быть) Но, делается реалок +1 много раз. Скажем с 20 до40 будет 20 реалоков, а это очень медленно. Можно сделать сразу +20 за 1 раз, что в 20 раз быстрее. Но тогда будет код пообширнее, лень его здесь писать.

Кстати да, есть утечка при УМЕНЬШЕНИИ размера 1 цикл не закончен. Вобщем итого будет 2 IF, внутри каждого по циклу для создания/удаления int[2] и общий реалок.

Последний раз редактировалось alexzk; 05.04.2018 в 11:30.
alexzk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
массив указателей nwhta Помощь студентам 2 23.11.2016 15:22
Массив указателей. dmitrykzmn Общие вопросы C/C++ 8 20.01.2016 19:41
Массив указателей CaXaH Общие вопросы C/C++ 11 25.09.2012 12:06
Указатель на массив указателей на массив char'ов... SrgGld Общие вопросы C/C++ 0 19.11.2010 23:35
Массив указателей askar Общие вопросы C/C++ 5 07.09.2010 23:11