Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Переопределение размера массива указателей  (Прочитано 8892 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Aether
Специалист

ru
Offline Offline
Пол: Мужской

« : 07-11-2015 12:12 » 

Доброго дня.
Маленько запутался.))

Дано (упрощу до сути):

Массивы и их размеры:
Код:
int Array_A_Size = 200;
int* Array_A = new int[Array_A_Size];

int Array_B_Size = 400;
int* Array_B = new int[Array_B_Size];

int Array_C_Size = 600;
int* Array_C = new int[Array_C_Size];

Массив указателей, который сперва должен хранить массивы А и B:
Код:
int Number_of_Arrays = 2;
int** Arrays = new int*[Number_of_Arrays];
Arrays[0] = Array_A;
Arrays[1] = Array_B;

А теперь надо добавить к А и В указатель на массив С;
Код:
Number_of_Arrays++;
int** New_Arrays = new int*[Number_of_Arrays];
for (int i = 0; i < (Number_of_Arrays - 1); i++)
  {
  New_Arrays[i] = Arrays[i];
  }
New_Arrays[Number_of_Arrays - 1] = Array_C;

Далее самое важное: массив Arrays нужно удалить и передать ему указатель от нового, переопределённого, массива New_Arrays.
Код:
delete Arrays;
Arrays = New_Arrays;

Вопрос: delete уничтожит только массив Arrays или пойдёт реакция и по компонентам, то есть освободятся A, B, C... И какова разница в реакции при использовании delete[];

Опыта не хватает, может в С++ есть более рациональный способ переопределения размера массива, типа realloc?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 07-11-2015 13:14 » 

delete не удаляет подмассивы. Т.е. не происходит удаление вглубь. Только удаляется тот массив, указатель на который ты указал.

Разница между delete и delete []. В втором случае, ты сообшаеш компилятору, что ты хочеш удалить именно массив. А не один элемент.

В стандартных менеджерах памяти С++, насколько я знаю, нету способа узнать размер массива. sizeof эффективен только на одном элементе и на структуре.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 07-11-2015 18:17 » 

может в С++ есть более рациональный способ переопределения размера массива, типа realloc?

Так четверка calloc, malloc, free, realloc никуда не делась из C++ (по крайней мере, в стандарте ISO/IEC 14882 она присутствует). Просто объявления перекочевали из <stdlib> в <cstdlib>. В данном случае будет вполне уместно их применение, если заранее неизвестно, до каких размеров вырастет "массив массивов".
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 09-11-2015 11:22 » 

И какова разница в реакции при использовании delete[];
В данном случае, никакой. Менеджер памяти в любом случае должен освобождать весь блок, который выделен по данному адресу вызовом new.
delete[] нужен, чтобы корректно удалять массив объектов, вызывая у каждого из них деструктор. У обычных указателей никаких деструкторов нет.
Но хорошим тоном было бы и здесь вызывать delete[], чтобы код читать проще было, не гадая, какого рода память здесь освобождается, массив или одиночный объект.
« Последнее редактирование: 09-11-2015 11:28 от Вад » Записан
Aether
Специалист

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 09-11-2015 14:26 » new

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

Но хорошим тоном было бы и здесь вызывать delete[], чтобы код читать проще было, не гадая, какого рода память здесь освобождается, массив или одиночный объект.
Так и сделал.

может в С++ есть более рациональный способ переопределения размера массива, типа realloc?

Так четверка calloc, malloc, free, realloc никуда не делась из C++ (по крайней мере, в стандарте ISO/IEC 14882 она присутствует). Просто объявления перекочевали из <stdlib> в <cstdlib>. В данном случае будет вполне уместно их применение, если заранее неизвестно, до каких размеров вырастет "массив массивов".
Нету возможности отказаться от механизма: new-delete, так как не все компоненты написаны мною. В то же время побаиваюсь использовать и то, и то совместно. В моём понимании это может приводить к ошибкам - два разных менеджера памяти. Но, даже, если современные библиотеки обеспечивают совместимость между собой, всё равно проще обеспечить гарантию чёткости работы использованием одного механизма.

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

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines