Понимание поведения висячего указателя в этом случае - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть указатель, и по умолчанию он несет NULL , затем он ждет некоторого события и получает значение, если событие произойдет, позже Я освобождаю указатель где-то иначе но даже после освобождения указателя я не делаю его равным NULL , поэтому он все еще продолжает ссылаться на ту же ячейку памяти , и я знаю, что следующий вызов malloc может выделить этот фрагмент памяти для какой-то другой запрос памяти!

pointer_type *p = NULL;
while (process_get_wakeup(//some logic//)) { 
        while ((qelem = (void*)process_dequeue(//some logic//)) != NULL) {
           p = (pointer_type *)qelem;
        }
        .
        .
        //goes into a loop of calls where free(p) is also done!
        .
        .
        //Printing value of p as %p gives this : 0xFF00000000

РЕДАКТИРОВАТЬ: Я уже знаю, не то, как мы должны это делать , и я не могу ожидать, чтобы сохранить то же значение, которое может быть использовано для чего-то другого сейчас, но то, что я хочу Я знаю, почему я вижу только определенное значение p !

Имеет ли это значение: 0xFF00000000 какое-либо особое значение?

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

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

p = NULL; /* now it's points to NULL */
p = malloc(SIZE); /* malloc() may give same previews memory location or may not */

Из стандарта C, раздел 6.2.4

Время жизни объекта - это часть выполнения программы, в течение которой для него гарантированно сохраняется хранилище.Объект существует, имеет постоянный адрес и сохраняет свое последнее сохраненное значение в течение всего времени жизни.Если на объект ссылаются вне его времени жизни, поведение не определено.Значение указателя становится неопределенным, когда объект, на который он указывает (или только что прошедший), достигает конца своего времени жизни.

И

Я не могу ожидать, чтосохранить то же значение, которое может быть использовано для чего-то другого сейчас?

Вы не можете заставить malloc() не возвращать тот же старый адрес памяти после освобождения.Освобожденная память больше не принадлежит вашей программе, в следующий раз, когда ваш процесс попытается снова выделить память, malloc() может возвращать тот же адрес (не значение) или нет.

0 голосов
/ 11 сентября 2018

Наоборот - указатель не сохраняет свое значение после free.

Стандарт C говорит, что, как только объект становится free d или, в более общем смыслеего время жизни заканчивается, значения всех указателей, указывающих на объект, становятся неопределенными , и использование такого неопределенного значения может привести к неопределенному поведению, даже если оно просто печатало значение.То, что он выглядит так, как будто он сохраняет свое первоначальное значение, никоим образом не гарантируется.

Это позволяет компилятору C оптимизировать вашу функцию.Например, если он использовал один регистр ЦП для сохранения значения p, после вызова free(p) компилятор знает, что регистр теперь можно использовать для чего-то другого, например, для хранения результатовпромежуточные вычисления других операций, и его значение не нужно сохранять до тех пор, пока ему не будет присвоено новое значение.


Что касается адреса памяти двух различных объектов, которые являются одинаковыми - это возможно, если они не живы одновременно.Один объект будет иметь постоянный адрес в течение всего времени его существования.Что происходит после его жизни, не уточняется.malloc часто реализуется в виде списка свободных блоков, и последний из них free d, вероятно, будет повторно использован первым.

...