Классы. Динамически создаваемый одномерный массив c помощью методов класса

Классы дают замечательные возможности. Порождаемые от объектов классы могут представлять из себя очень разные сущности от обычного массива до очень сложных структур данных. Новички, пришедшие в С++ часто сталкиваются с проблемой перевыделения памяти массива. Обычные массивы, пришедшие и языка С, в С++ нерасширяемы, несужаемы. Они как бы есть и всё, какие есть, такие и есть. Но есть и указательные переменные, благодаря которым программист может оперировать участками памяти. В простейшей ситуации память выделяется один раз во время выполнения программы и перераспределить её можно путём выделения нового участка памяти, копирования туда информации из старого участка, зачистке старого участка и перенаправлением указателя на свежеиспечённое место. Это, впринципе, и при использовании классов так, но при использовании классов становится проще создавать объекты и использовать объекты, как если бы они были сами по себе динамическими массивами.
Динамический массив — это массив, который способен изменять свою вместимость элементов прямо по ходу работы программы. Т. е. такому массиву сказали, сколько элементов хотим в нём иметь, он столько и заимеет. Такие массивы достаточно удобны благодаря своей расширяемости. Примером показывается создание именно такого массива.

В параметрах метода Create используется ссылка на указатель. Поскольку указатель вообще ни разу не массив, а внутри функций без ссылки на указатель будет создана копии указательной переменной, пришедшей в параметр, без этого могут возникнуть проблемы при выполнении программы. Описание, когда можно и когда нельзя — выходит за рамки статьи. Для этого нужно понимать указатели, понимать отличие ссылочных параметров функций и обычных параметров. Суть в том, что может получиться копия указателя, которая внутри функции зародится и внутри функции и умрёт, как обычная локальная переменная функции.

  • Если внутри функции будет создана копия указателя, этой копии указателя будет выделена память, то как и самая обычна локальная переменная при завершении работы функции, указатель будет уничтожен, связь с выделенной памятью потеряется. То, что было выделено, то так и останется висеть в памяти, если внутри той же функции не применить delete. (В контексте фразы только показанный код)

Чтобы этого избежать и использовать указательную переменную извне функции, в некоторых случаях возможно использовать только ссылку на указательную переменную. В нашем случае указательная переменная используется напрямую, копии внутри функции не создаётся, поэтому всё работает хорошо.

Я не стал особо выпендриваться и поэтому выбрал простой одномерный массив и только стандартные методы для работы с ним. Если вы изучаете C++ и наткнулись на этот материал, то я искренне буду надеяться, что он оказался полезным, помог что-то понять и узнать новое.

5 комментариев на «“Классы. Динамически создаваемый одномерный массив c помощью методов класса”»

  1. mnxoid:

    P=NULL; //следуя правилам хорошего тона инициализируем его как пустой
    Я один здесь вижу утечку памяти? Вы выделяете память на int и обнуляете указатель, тем самым теряете доступ к участку памяти, выделенном при помощи new.
    Может вы имели ввиду *P=NULL ❓

  2. Nik:

    я все таки не могу понять, чем *&Arr отличается от []Arr. при чем тут вообще «*», «&», да еще и сразу?

    • []Arr == *Arr
      *Arr — создает локальную копию указателя на начало массива. Маленькая такая совсем, но все-таки дополнительная переменная, которая создается внутри функции локально и уничтожается внутри функции при выходе из нее.
      *&Arr — не создает локальную копию указателя на начало массива. Это ссылка на указатель. Работает по принципу "Функция, принимающая параметры по ссылке", т.е. напрямую с основным указателем на начало массива.
      Эффект должен стать заметен при большом количестве вызова функции.(не смотрел, но по идее так).

  3. Аноним:

    Что-то я совсе ничего не понял. Прошлый урок был понятен, а этот сразу начался с каких-то Arr. Хоть бы объяснили что это. Впервые вижу такой синтакстис

  4. Дмитро:

    Автору сайту — велике спасибі. Тема дійсно для початківців, і цей приклад у своєму роді відмінний.
    Так він не ідеальний але це приклад і привід знайти помилки і самому написати краще. Всім хто критикують прохання самим писати приклади.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Поиск

 
     

Случайная книга в электронном формате

https://www.litres.ru/sem-numen/sozdanie-mikroservisov-18307468/?lfrom=15589587
Яндекс.Метрика