Установка pointee в NULL, поэтому любой указатель на этот адрес равен NULL - PullRequest
0 голосов
/ 29 апреля 2010

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

Ответы [ 4 ]

5 голосов
/ 29 апреля 2010

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

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

Я предлагаю либо выучить уроки любого языка, который вы хотите использовать, либо перейти на язык, с которым вы чувствуете себя безопаснее. То, о чем вы говорите, это что-то вроде подсчета ссылок, и есть много языков, которые имеют это (Objective-C приходит на ум, например).

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


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

char *x = malloc(50);
char *y = x;
free (x);
// Both x and y are now magically set to NULL.

Вы могли бы добиться этого, выполнив форму косвенного обращения в C. Другими словами, перехватите malloc (вручную или с помощью некоторого gcc-подобного метода ленивого связывания), чтобы вместо возврата указателя на выделенный блок, он возвращает указатель на выделенный указатель на выделенный блок.

Вызовы free также должны быть изменены, чтобы освободить блок, но не выделенный указатель (который будет установлен в NULL). Тогда операции косвенного обращения в вашем коде должны быть двойными (**x вместо *x):

char **x = mymalloc(50);
char **y = x;
myfree (x);
// Both *x and *y are now magically set to NULL.

В графическом виде:

+---+
| x | -+
+---+  |   +--------+      +------+
       +-> | tmp000 | ---> | data |
+---+  |   +--------+      +------+
| y | -+
+---+

Когда вы вызываете myfree, data будет освобожден, но не указатель tmp000. Для него будет задано значение NULL, чтобы при попытке ввода x или y до data вы получили ошибку.

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


Возможно, проблему «лежащих вокруг указателей» можно решить с помощью счетчика ссылок в tmp000, но вам нужно убедиться, что все копии указателя были отслежены, например, char **y = mydup(x);.

Проблема «избиения тебя до полусмерти», по сути, неразрешима.

2 голосов
/ 29 апреля 2010

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

Это касается разницы между нулевым набором и пустым набором. Если я опустошу банку с печеньем, у меня все равно останется банка с печеньем (пустой набор). Чтобы получить ноль, я должен полностью избавиться от банки. Ничто из того, что я делаю с содержимым банки, не меняет того факта, что у меня есть банка.

tl; др: нет

2 голосов
/ 29 апреля 2010

Нет. Обнуление памяти не повлияет на указатели на эту память. И, конечно, вы не можете обнулить память после ее освобождения.

1 голос
/ 29 апреля 2010

Указатель - это просто адрес. Если адрес равен 0, в большинстве систем это будет нулевой указатель. Данные, хранящиеся в адресе, на который ссылается указатель, никоим образом не проверяются при проверке, является ли указатель нулевым. Эти данные загружаются из памяти только при разыменовании указателя.

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