Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вказівники та посилання.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
857.42 Кб
Скачать

8. Вказівники і динамічні змінні (керування пам'яттю)

Оператор new для отриманя пам’яті викликає функцію

extern void* _new (long);

Параметр задає розмір пам’яті в байтах. Якщо new()не зможе знайти необхідну кількість вільних бійтів, то вона поверне нуль.

Оператор delete для звільнення пам’яті викликає функцію

extern void _delete (void*);

Результат виклику _delete() для вказівника, який не був ініціалізований через _new() є не визначеним. Це стосується також повторного виклику _delete() для одного і того ж вказівника. Проте знищення за допомогою _delete() вказівника із значенням нуль є безпечною операцією.

Важливою перевагою операторів new, delete, delete[] над функцями С є те, що С++ дозволяє визначати нові версії операторів new, delete i delete[], наприклад

Приклад 2

# include <iostream>

Void* operator new(size_t t)

{

std::cout <<"AAAAA";

return NULL;

}

Void operator delete(void* p)

{

std::cout <<"BBBBB";

}

main()

{

int *k;

k = new int;

delete k;

}

Прикл. 1.2.2 ілюструє ще одну можливість С++, яка називається перевантаженням функцій та операторів. Про перевантаження детальніше мова ведеться в розділах 3 та __.

Принципову відмінність між оператором new i функцією mal­loc() ілюструє наступний приклад

Приклад 3

# include <alloc.h>

Void main()

{

//буде повернено ненульовий вказівник

int* i=new int[0];

// буде повернено нульовий вказівник

int* j=(int*) malloc(0);

}

З прикл. 3 можна побачити, що використання new може при­вес­ти до того, що буде виділено ненульовий вказівник при запиті нуля байтів. Це, у свою чергу, призводить до колізіі, оскільки реально для да­но­го про­грам­ного об'єкта пам'яті не було виділено. Функція malloc() дає змогу уник­нути цієї ситуації. Проте дана функція повертає void* і в С++ треба здійснювати приведення типів ((int*) malloc(0) у прикл. 2).