int *p;
{
int x = 0;
p = &x;
}
// p is no longer valid
{
int x = 0;
if (&x == p) {
*p = 2; // Is this valid?
}
}
Доступ к указателю после освобождения вещи, на которую он указывает, был undefined, но что произойдет, если какое-то последующее распределение происходит в той же области, и вы явно сравниваете старый указатель с указателем на новую вещь? Было бы важно, если бы я использовал &x
и p
до uintptr_t
, прежде чем сравнивать их?
(Я знаю, что это не гарантирует, что две переменные x
занимают одно и то же место. У меня нет причин для этого, но я могу представить, скажем, алгоритм, в котором вы пересекаете набор указателей, которые могли быть освобождены с набором определенных действительных указателей, удалив недопустимые указатели в этом процессе. Если ранее недействительный указатель равен известному хорошему указателю, мне любопытно, что произойдет.)