有没有办法将指针指向的内存中的位置设置为NULL,而不是指向NULL的指针,以便指向该位置的任何其他指针都为NULL?
不是试图保护自己免受自己的错误,有什么方法可以向他们学习,以便将来你不会再犯同样的错误?:-)
所有这些事情,例如当释放它们后面的内存时将指针设置为NULL,或使用"安全"字符串函数,相信即使使用所谓的不安全事物也可以完全安全地掌握在人们手中知道他们在做什么.
我的建议是要么学习你想要使用的任何语言的陷阱,要么转向你觉得更安全的语言.你所谈论的是类似于引用计数的东西,并且有许多语言都有这个(Objective-C让人想起一个).
但是,如果你要或者被迫用C编码,学习语言,包括它的黑暗面 - 你将成为一个更好的编码器.
顺便说一下,我认为你所要求的是一种跟踪指针别名的方法,这样,如果释放一个后面的内存,所有别名都会自动设置为NULL:
char *x = malloc(50);
char *y = x;
free (x);
// Both x and y are now magically set to NULL.
Run Code Online (Sandbox Code Playgroud)
您可以通过在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.
Run Code Online (Sandbox Code Playgroud)
以图形形式:
+---+
| x | -+
+---+ | +--------+ +------+
+-> | tmp000 | ---> | data |
+---+ | +--------+ +------+
| y | -+
+---+
Run Code Online (Sandbox Code Playgroud)
当你调用时myfree,data将被释放但不是tmp000指针.它将被设置为NULL,因此,无论您是使用x还是y尝试进入data,都会出现错误.
当然,这有一个问题就是让指针四处乱晃,并且增加的问题是看到这段代码的第一个体面的C编码器会跟踪你并击败你的纸浆:-)
可能通过使用引用计数来解决"四处tmp000寻找"问题,但您必须确保跟踪指针的所有副本,例如char **y = mydup(x);.
对于所有意图和目的而言,"打败你的纸浆"问题是不可解决的.
| 归档时间: |
|
| 查看次数: |
204 次 |
| 最近记录: |