Ошибка: место записи нарушения прав доступа C++

Функция Vector Insert () в C++ Программирование и разработка

Когда вы имеете дело с кодами, написанными на любом языке программирования, высока вероятность того, что вы столкнетесь с различными типами ошибок. Точно так же, работая с C ++, вы сталкиваетесь с определенными типами ошибок, которые довольно сложно исправить. Однако, если вы внимательно посмотрите на свои методы кодирования, вы поймете, что эти ошибки — не что иное, как следствие ваших ошибок по неосторожности.

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

Что такое место записи ошибок доступа при нарушении прав доступа в C ++ в Ubuntu 20.04?

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

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

Читайте также:  Как создать MVP с помощью React и Firebase

Пример возникновения ошибки местоположения записи нарушения прав доступа в C ++ в Ubuntu 20.04

Чтобы объяснить вам сценарий, который может привести к возникновению ошибки местоположения записи нарушения прав доступа в C ++, мы закодировали следующий пример:

Чтобы объяснить вам сценарий, который может привести к возникновению

В этом небольшом примере кода C ++ у нас есть класс с именем «Test». Внутри этого класса у нас есть только одна общедоступная функция-член с именем «myFunc ()», тип возвращаемого значения которой — «void», т. Е. Эта функция ничего не возвращает. В рамках этой функции мы просто напечатали сообщение на терминале. Затем у нас есть функция main (), в которой мы сначала создали указатель на класс Test. После этого мы попытались получить доступ к функции «myFunc ()» класса «Test» с помощью указателя этого класса с помощью символа «.» оператор. Затем мы только что использовали оператор «return 0», чтобы закрыть наш код.

Мы использовали команду, показанную ниже, для компиляции этого фрагмента кода:

$ g++ Error.cpp –o Error

Как только мы попытались скомпилировать этот код C ++, на терминале возникла ошибка, показанная на следующем изображении:

Как только мы попытались скомпилировать этот код C ++

Другими словами, показанная выше ошибка также известна как ошибка местоположения записи нарушения прав доступа в C ++. Это означает, что мы попытались получить доступ к местоположению, к которому нам не разрешили доступ. Эта ошибка произошла в данном случае, потому что мы не создали ни одного экземпляра класса «Test», с помощью которого мы можем получить доступ к его функциям-членам. Скорее, мы просто создали указатель типа «Тест». Этот указатель не указывал на какое-либо конкретное место, из-за которого он содержал мусорный адрес. Вот почему, когда мы пытались получить доступ к функции-члену класса «Тест» при использовании этого указателя, на терминале возникла ошибка, поскольку этот адрес не содержал ссылки на действительный объект класса «Тест», с которым мы можем получить доступ к его функциям-членам.

Как исправить ошибку, описанную выше?

Есть два разных способа исправить ошибку местоположения записи нарушения прав доступа в C ++, которые мы только что обсудили выше. Эти два метода подробно обсуждались ниже.

Исправление 1. Путем динамического распределения памяти в C ++

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

В этом исправлении базовый код нашего образца класса такой же

В этом исправлении базовый код нашего образца класса такой же, однако мы внесли несколько изменений в нашу функцию «main ()». Во-первых, мы создали указатель типа «Test», используя ключевое слово «new». Делая это, мы, по сути, инициализируем указатель типа «Test» посредством динамического распределения памяти, т. Е. Выделяем эту память в куче. Затем с помощью этого вновь инициализированного указателя мы попытались получить доступ к функции-члену класса «Test», используя оператор «->» в C ++.

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

После внесения этого изменения в наш код он был успешно скомпилирован

Исправление 2: Создав действительный объект целевого класса в C ++

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

Опять же, в этом исправлении основной код для нашего образца класса тот же

Опять же, в этом исправлении основной код для нашего образца класса тот же, однако мы внесли несколько изменений в нашу функцию «main ()». Сначала мы создали объект или экземпляр класса «Test». Этот экземпляр или объект создается в стеке, а не в куче. Затем с помощью этого вновь созданного объекта мы попытались получить доступ к функции-члену класса «Test», используя при этом символ «.» оператор в C ++.

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

и когда мы выполнили этот скомпилированный код, мы получили

Вывод

В этом руководстве дано хорошее объяснение ошибки местоположения записи нарушения прав доступа в C ++ в Ubuntu 20.04. Для достижения этой цели мы сначала объяснили вам значение этой ошибки, а затем методы программирования, которые могут привести к этой ошибке. После этого мы поделились с вами примером сценария, который может вызвать эту ошибку, а также методами, с помощью которых вы можете легко ее исправить. Прочитав эту статью, вы сможете избежать этой ошибки при создании своих программ на C ++ в Ubuntu 20.04.

Оцените статью
bestprogrammer.ru
Добавить комментарий