что происходит с памятью, назначенной строке, адресуемой указателем, когда этот указатель указывает на новую строку? - PullRequest
0 голосов
/ 12 июня 2018
    char *p = "hello";
    p = "hello_2";

Здесь строка «hello» была сохранена в памяти, и ее адрес присутствовал в указателе «p», но когда этот указатель начнет указывать на строку «hello_2», что произойдет с памятью, где была строка «hello»хранится?Будет ли он освобожден или эта строка останется там, но мы не можем получить к ней доступ?

Ответы [ 4 ]

0 голосов
/ 12 июня 2018

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

gcc создает раздел .rodata, который является разделом только для чтения, и строковые литералы хранятся там.

Visual C ++ создает раздел .rdata дляраздел только для чтения.

Вы можете использовать objdump (в linux) для проверки различных разделов вашего бинарного файла.

0 голосов
/ 12 июня 2018

Память не будет освобождена.Но не будет (в этом случае) потерянным.Код знает, где находится строка, и использует ее при каждом запуске фрагмента, чтобы назначить указатель p.

  • Память, находящаяся в куче, должна быть освобождена (результатmalloc или strdup).

  • Память, находящаяся в стеке, освобождать не нужно.

  • Статическая память (этодело) не нуждается в освобождении.
0 голосов
/ 12 июня 2018

На самом деле вы создаете строковый литерал с именем "hello", размещая его где-то в памяти и присваивая адрес первого символа литерала указателю p, и поскольку указатель не является постоянным, вы можете назначить его сновас разными адресами.И еще один важный момент, который следует отметить, заключается в том, что созданный строковый литерал находится в постоянной памяти.

0 голосов
/ 12 июня 2018

У вас есть строковая константа, которая хранится в постоянной памяти.Таким образом, эту память не требуется освобождать явно, используя free()

До тех пор, пока допустимо время жизни переменной p, вы можете получить доступ к сохраненной строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...