Скачиваний:
190
Добавлен:
05.07.2021
Размер:
16.53 Mб
Скачать

4. Утечка памяти (memory leak). Потерянный указатель (dangling pointer, wild pointer). Примеры использования.

Утечкой памяти (memory leak) называется ситуация, когда в программе нет ни одного указателя, хранящего адрес объекта, созданного в динамической памяти.

void allocate(const int n) { char *str = new char[n]; }

int main() { allocate(10); return 0; }

Висячей ссылкой или висячим указателем (dangling pointer, wild pointer, dangling reference) называется указатель, ссылающийся на уже удалённый объект (или не ссылающийся на допустимый объект соответствующего типа).

int main() {

MyClass *object = new MyClass ();

MyClass *object2 = object;

delete object;

object = nullptr;

// now object2 points to something which is not valid anymore

}

5. Проблемы, связанных с использованием операторов new и delete при управлении динамической памятью. Примеры использования.

см. вопр. 3, 4

6. Динамически создаваемые объекты (dynamically allocated objects). Интеллектуальные указатели (smart pointers): преимущества, недостатки, особенности использования, различия. Примеры использования.

см. вопр. 5

ИУ действует как обычный указатель, но она автоматически удаляет объект, на который он указывает, когда нет ни одного указателя, ссылающегося на объект.

В С++ существует 3 вида ИУ, которые отличаются способами управления своими базовыми указателями:

  1. shared_ptr – позволяет нескольким указателям указывать на один и тот же объект; подсчитывает ссылки на динамически созданный объект

  2. unique_ptr – позволяет только одному указателю одновременно указывает на объект

  3. weak_ptr – является второстепенной ссылкой на объект, управляемый указателем shared_ptr

Классы ИУ являются шаблонным, поэтому при его создании тип данных, на который способен указывать ИУ, необходимо явно указать.

shared_ptr<string> str_ptr;

shared_ptr<vector<int>> vec_int_ptr;

7. Динамически создаваемые константные объекты. Примеры использования.

Константные объекты можно так же создавать динамически.

const int *size = new const int(10);

const int *arr_i = new const int[*size]();

for (int i = 0; i < *size; i++) cout << arr_i[i] << endl;

// будет выведено 10 нулей

8. Класс интеллектуального указателя shared_ptr. Методы класса указателя shared_ptr. Особенности и примеры использования.

Классы ИУ являются шаблонным, поэтому при его создании тип данных, на который способен указывать ИУ, необходимо явно указать.

Инициализированный по умолчанию SP хранит нулевой указатель. SP используется теми же способами, что и обычный указатель. Обращение к значению SP возвращает объект, на который он указывает.

Когда SP используется, то результат проверки может свидетельствовать, является ли SP нулевым.

shared_ptr<string> str(“Hello”);

if (str) {

cout << *str << endl;

if (str.unique()) {

cout << “unique ptr” << endl;

} else {

cout << str.use_count() << endl;

}

} else {

cout << “invalid ptr” << endl;

}