Вместо того, чтобы пытаться защитить себя от собственных ошибок, есть ли какой-нибудь способ, которым вы могли бы поучиться у них, чтобы в будущем вы больше не повторяли те же ошибки? : -)
Все эти виды вещей, такие как установка указателей на 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);
.
Проблема «избиения тебя до полусмерти», по сути, неразрешима.