Указатели в C ++

Указатель - это особый вид переменной, предназначенный для хранения адреса в памяти другой переменной. Объявить указатель так же просто, как объявить любую другую переменную, но с этим сложно справиться. Итак, вот вам вопрос: как передать 2D-массив в функцию, если параметры массива не объявлены глобально? Выберите свой ответ из представленных на изображении ниже. Кроме того, предложите в комментарии, если у вас есть другой подход.

Висячие указатели в C ++

Указатель, указывающий на участок памяти, который был удален / выделен или выпадает из области видимости, называется висячим указателем. Причины зависания указателей:

  • Указатель на память, которую вы удалили.
int main()
{
    int num = 47;
    int *ptr = #
    
    free(num);
    //ptr is pointing to a de-allocated memory
    //dangling pointer
    cout<< ptr << endl;
}
  • Вернуть локальную переменную при вызове функции.
int *fun()
{
    int num = 47;
    return &num;
}
int main()
{
    int *ptr = fun();
    //ptr falls out of scope
    //dangling pointer
    cout<< ptr << endl;
}
  • Указание на переменную, выходящую за рамки.
int main()
{
    int *ptr;
    {
        int num = 47;
        ptr = &num;
    }
    // ptr goes out of scope
    // dangling pointer
    cout<< ptr << endl;
}

Вот несколько вопросов, над которыми вы можете задуматься!

  1. Какое влияние на нашу программу оказывает наличие висячих указателей?
  2. Как избежать висящих указателей в нашей программе?

Утечка памяти в C ++

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

Итак, вот несколько вопросов, над которыми вы можете задуматься!

  1. Каковы последствия утечки памяти в нашей программе?
  2. Как избежать утечек памяти?

Плохой указатель в C ++

Когда указатель выделяется впервые, он не имеет указателя, т.е. указатель является «неинициализированным» или «плохим». Операция разыменования неверного указателя - серьезная ошибка времени выполнения. Код будет компилироваться нормально, но во время выполнения каждое разыменование с плохим указателем каким-то образом повредит память. В результате программа рано или поздно выйдет из строя. Обязанность программиста - убедиться, что каждому указателю назначен указатель перед его использованием.

Разыменование значения указателя после его освобождения

Предположим, мы выделяем указатель и освобождаем связанную память после его использования. Если мы попытаемся использовать указатель снова, это закончится неопределенным поведением: возможно, произойдет сбой, который зависит от состояния системы / платформы. Итак, идея состояла бы в том, чтобы никогда не использовать указатель после того, как он был освобожден. Даже хорошая практика - установить указатель на 𝗡𝗨𝗟𝗟 после того, как он был освобожден, так что нарушение прав доступа улавливает любую попытку использовать его снова.

Итак, вот несколько важных вопросов для изучения:

  1. Есть ли способ снова использовать указатель? Считать!
  2. Как система обрабатывает статическое и динамическое выделение и освобождение памяти?

Статическая память в C ++

Стек - это область в памяти компьютера, которая отвечает за хранение 𝘁𝗲𝗺𝗽𝗼𝗿𝗮𝗿𝘆 𝘃𝗮𝗿𝗶𝗮𝗯𝗹𝗲𝘀. Во время выполнения переменные объявляются, сохраняются и инициализируются в стеке. Поскольку стек является временным хранилищем памяти, память переменных автоматически стирается после завершения вычислительной задачи.

Попытка освободить память в стеке с помощью функции 𝗳𝗿𝗲𝗲 () выдаст 𝗮𝗰𝗰𝗲𝘀𝘀 𝘃𝗶𝗼𝗹𝗮𝘁𝗶𝗼𝗻. Управление памятью в стеке (переменные, не являющиеся указателями) осуществляется системой неявно.

Вот несколько важных вопросов для изучения:

  1. Каков объем переменных, хранящихся в стековой памяти?
  2. Как стек распределяет память, используемую временными переменными?

Распределение динамической памяти в C ++

Память, также известная как 𝗱𝘆𝗻𝗮𝗺𝗶𝗰 память, является альтернативой локальной стековой памяти. Локальная память выполняется автоматически: она выделяется автоматически при вызовах функций и автоматически освобождается при выходе из функции.

Память кучи во всех отношениях разная. Программист должен явно запросить выделение памяти 𝗯𝗹𝗼𝗰𝗸 определенного размера, и блок продолжает выделяться до тех пор, пока программист явно не попросит его освободить. 𝗛𝗲𝗿𝗲 𝗮𝗿𝗲 𝘀𝗼𝗺𝗲 𝗰𝗿𝗶𝘁𝗶𝗰𝗮𝗹 𝗾𝘂𝗲𝘀𝘁𝗶𝗼𝗻𝘀 𝘁𝗼 𝗲𝘅𝗽𝗹𝗼𝗿𝗲:

  1. В чем преимущество выделения памяти в куче перед выделением памяти в стеке?
  2. Рекомендуется ли повторно использовать указатель после освобождения динамически выделяемой памяти?

Символьный массив и символьный указатель

Мы можем инициализировать строку в C ++ по-разному, например, массивом символов или указателем на символы. У каждого из них есть свои плюсы и минусы.

Вот несколько важных вопросов для изучения:

  1. Найдите сходства и различия между ними?
  2. Как система распределяет память в каждом случае?
  3. Какой из них мы должны предпочесть и почему?

Ссылочная переменная в C ++

Ссылочная переменная - это псевдоним, то есть другое имя для уже существующей переменной / экземпляра памяти. После инициализации ссылки с помощью переменной имя переменной или имя ссылки могут ссылаться на переменную. Ссылочная переменная, однажды определенная для ссылки на переменную, не может быть изменена так, чтобы указывать на другие переменные.

Всегда ли необходим оператор «&» при передаче по ссылке?

При передаче по ссылке вызывающему не всегда нужно использовать оператор «&» для вычисления нового указателя на интересующее значение. Иногда у вызывающего уже есть указатель на интересующее значение, поэтому вычисление нового указателя не требуется. Указатель на интересующее значение может передаваться без изменений.

Ключевое слово const в C ++

В C ++ константа используется для того, чтобы сделать некоторые значения постоянными во всей программе, или, другими словами, переменные, объявленные с помощью ключевого слова const, становятся константами и не могут быть изменены программой.

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

Ключевое слово volatile в C ++

В языке программирования C / C ++ переменная или объект, объявленный с помощью ключевого слова volatile, обычно имеет специальные свойства, связанные с оптимизацией объектов, которые могут изменяться способами, которые компилятор не может определить.

Оптимизация выполняется путем кеширования переменных в регистрах. Ключевое слово volatile предназначено для предотвращения применения компилятором любых оптимизаций в коде, предполагающих, что значения переменных не могут изменяться «сами по себе».

Ключевое слово volatile предназначено для использования в сочетании с переменными, к которым осуществляется доступ и которые изменяются в разных потоках. По сути, без volatile либо написание многопоточных программ становится затруднительным, либо компилятор тратит впустую огромные возможности оптимизации.

Шаблоны на C ++

Шаблоны позволяют нам писать общие программы на C ++. Проще говоря, мы можем создать одну функцию или класс для работы с разными типами данных с помощью шаблонов.

Идея шаблонов C ++ проста: мы можем сделать код зависимым от параметров, чтобы его можно было использовать в различных ситуациях, создавая экземпляры параметров по мере необходимости. Во всех языках программирования самой простой формой кода, который принимает параметр, является функция.

Наслаждайтесь обучением, наслаждайтесь программированием!