Указатель — очень мощная функция C++. Это как иметь инструмент бога для выполнения божественных задач (хорошо, я могу немного преувеличить, но вы поняли). Однако с большой силой приходит большая ответственность. В этой статье мы обсудим распространенные проблемы безопасности памяти при использовании указателя в вашем проекте.

Что такое указатель?

Давайте просто вспомним немного об указателе. Как вы знаете, каждая переменная является ячейкой памяти. Эта ячейка памяти имеет адрес, доступ к которому можно получить с помощью оператора амперсанда (&).

Это приведет к:

Address of myvar: 0x7ffc576b3bbc
Value of myvar: 10

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

Этот выведет следующее:

Address of myvar: 0x7ffc669e6704
Value of myvar: 10
Value of mypointer: 0x7ffc669e6704
Value pointed to by mypointer: 10

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

Ладно… ладно, расслабься… Ты же знаешь, что ты не единственный, кто читает этот блог, верно? (ну, я на это надеюсь…). Есть люди, которые не всегда используют указатели в C++, и они изучают здесь все новое. Так что подведение итогов, на мой взгляд, необходимо. Но да, я также согласен, что у нас этого достаточно, давайте перейдем к следующей части.

Что такое безопасность памяти?

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

Обычно на каких-то других языках, например Java. Существует сборщик мусора, который помогает решать проблемы с памятью. Однако в C++ вы должны сделать это самостоятельно. У обеих конструкций есть свои преимущества и недостатки, но мы не будем обсуждать этот аспект здесь, потому что это длинная и подробная тема для другого дня. Но не унывайте, у нас еще может быть мем об этом.

Что такое утечки памяти?

Утечки памяти происходят, когда новая памятьвыделяется динамически и никогда не освобождается. В C++ новая память обычно выделяется оператором new и освобождается. оператором delete или delete []. Проблема с утечками памяти заключается в том, что они накапливаются со временем и, если их не остановить, могут повредить или даже привести к сбою программы.

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

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

В приведенном ниже примере память перераспределяется с помощью указателяptr . Происходит следующее: первое выделение безвозвратно теряется, как и 30 байтов, на которые оно указывало. Теперь их невозможно освободить, и у вас утечка памяти.

Что такое висячий указатель?

Висячий указатель указывает на память, которая уже была освобождена. Адрес памяти, в котором хранятся данные, больше не используется. действительный. Любая попытка изменить или получить к нему доступ приведет к ошибке сегментации. В этом примере invalid_pointer() элемент ptr2 называется хотя он был удален.

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

В приведенном выше примере ptr указывает на my_array[10] , которого больше не существует после выхода из out_of_scope_pointer() . Это может привести к неопределенному поведению.

Позаботьтесь о сохранности памяти

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

Однако, как мы обсуждали выше в этой статье, все может усложниться, когда вы пишете более 10000 строк кода. Это может сделать эти проблемы очень трудно найти.

Но эй, это не конец света. По мере роста ваших навыков вы обнаружите, что естественным образом пишете код, который защищает ваши приложения от утечек памяти. Просто помните о лучших практиках при программировании. Даже Джерри знает, как получить gudddd!

Немного светской беседы

О, привет, случайный незнакомец. Вы знаете, что я писал другую статью и планировал сделать ее частью 2 этой серии. Вот почему мне требуется так много времени, чтобы вернуться. Однако в какой-то момент я считаю, что статьядолжна быть в другой серии. Что ж, может быть, в какой-то момент вы обнаружите, что я публикую серию о хостинге и облачной системе. , бла… бла… бла… знаешь? Скучные вещи.

В последнее время у меня на работе наступил момент, когда я немного выгорел. Я думаю, что мне, возможно, придется что-то делать с этим в ближайшее время. Сейчас я развлекаюсь, занимаясь Leetcode, изучая C++ и алгоритмы. Вы тоже должны попробовать. Я где-то читал, что изучение новых вещей делает вас счастливыми. Вот почему в этой серии статей мы углубимся в некоторые другие проблемы, связанные с C++.

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

Спасибо, случайный незнакомец.