1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
//Visual Studio Express 2012 #include <iostream> #include <ctime> #include <cstdlib> //rand using namespace std; class Massiv //Наш класс { public: void Create(int *&Arr, const int N); //Метод выделения памяти под массив void Delete(int *Arr); //Метод освобождения памяти void Fill(int *Arr, const int N); //Метод заполнения массива значениями void Show(int *Arr, const int N); //Метод отображения массива на экране }; void Massiv::Create(int *&Arr, const int N) //Вне класса описываем метод выделения памяти под массив { Arr = new int[N]; } void Massiv::Delete(int *Arr) //Вне класса описываем метод освобождения памяти { delete[]Arr; //очищаем память от массива Arr = NULL; //указываем, что теперь массив должен находится в новом зарезервированном месте и указывает вникуда } void Massiv::Fill(int *Arr, const int N) //Вне класса определяем функцию заполнения массива { for (int i = 0; i<N; i++) Arr[i] = rand() % N + 1; //я решил заполнять случайными значениями } void Massiv::Show(int *Arr, const int N) //Вне класса определяем функцию отображения массива на экране { for (int i = 0; i< N; i++) cout << Arr[i] << " "; } int main() { srand(time(NULL)); //Включаю генератор псевдослучайных значений int *Ptr = NULL; Massiv Massiv; //объект массив типа массив (справа объект - слева тип) int N = 0; //количество элементов для массива N = rand() % 20 + 1; //генерирую случайные числа, ноль не генерируем Massiv.Create(Ptr, N); //выделяю память для N элементов Massiv.Fill(Ptr, N); //Записываю в каждый элемент значение Massiv.Show(Ptr, N); //Показываю массив на экране Massiv.Delete(Ptr); //Освобождаю память cout << "\n\n"; cin.get(); } |
Чтобы этого избежать и использовать указательную переменную извне функции, в некоторых случаях возможно использовать только ссылку на указательную переменную. В нашем случае указательная переменная используется напрямую, копии внутри функции не создаётся, поэтому всё работает хорошо.
P=NULL; //следуя правилам хорошего тона инициализируем его как пустой
Я один здесь вижу утечку памяти? Вы выделяете память на int и обнуляете указатель, тем самым теряете доступ к участку памяти, выделенном при помощи new.
Может вы имели ввиду *P=NULL ❓
я все таки не могу понять, чем *&Arr отличается от []Arr. при чем тут вообще «*», «&», да еще и сразу?
[]Arr == *Arr
*Arr — создает локальную копию указателя на начало массива. Маленькая такая совсем, но все-таки дополнительная переменная, которая создается внутри функции локально и уничтожается внутри функции при выходе из нее.
*&Arr — не создает локальную копию указателя на начало массива. Это ссылка на указатель. Работает по принципу "Функция, принимающая параметры по ссылке", т.е. напрямую с основным указателем на начало массива.
Эффект должен стать заметен при большом количестве вызова функции.(не смотрел, но по идее так).
Что-то я совсе ничего не понял. Прошлый урок был понятен, а этот сразу начался с каких-то Arr. Хоть бы объяснили что это. Впервые вижу такой синтакстис
Автору сайту — велике спасибі. Тема дійсно для початківців, і цей приклад у своєму роді відмінний.
Так він не ідеальний але це приклад і привід знайти помилки і самому написати краще. Всім хто критикують прохання самим писати приклади.