Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的可用内存:如何检查有效指针?_C_Pointers_Free_Garbage - Fatal编程技术网

C中的可用内存:如何检查有效指针?

C中的可用内存:如何检查有效指针?,c,pointers,free,garbage,C,Pointers,Free,Garbage,我有一个程序,它通过指向内存区域(结构、数组)的指针在内存中存储大量内容,这个用户可以随时初始化程序。在初始化时,程序需要释放以前使用过的内存(如果有的话,这就是问题所在),并以可能不同的大小分配新的存储 现在,在第一次初始化时,我不知道我的指针指向什么:特别是,我不知道它们是否是垃圾。然而,如果他们没有,我需要释放他们所指的东西。我怎么知道?除了指向NULL的指针没有指向任何东西之外,没有办法检查给定指针是否指向有效的东西。跟踪仍然指向动态内存的指针是您的工作。(指针可以指向自动变量和静态变量

我有一个程序,它通过指向内存区域(结构、数组)的指针在内存中存储大量内容,这个用户可以随时初始化程序。在初始化时,程序需要释放以前使用过的内存(如果有的话,这就是问题所在),并以可能不同的大小分配新的存储


现在,在第一次初始化时,我不知道我的指针指向什么:特别是,我不知道它们是否是垃圾。然而,如果他们没有,我需要释放他们所指的东西。我怎么知道?

除了指向
NULL
的指针没有指向任何东西之外,没有办法检查给定指针是否指向有效的东西。跟踪仍然指向动态内存的指针是您的工作。(指针可以指向自动变量和
静态变量,当然不能尝试
释放变量。)

很多人一旦有了
free
d相关内存,就会将指针设置为
NULL
,并依赖于C标准将
free(NULL)
定义为禁止操作的事实。因此,您可以采用这种方法

但过度依赖这种代码可能会让人感到难闻,因为它会掩盖潜在的bug。只是在内存管理方面要更加小心


或者你可以自己构建一个这样的模型:

我们在这里谈论的是全局吗?因为它们会自动初始化为零。一般来说,您的程序应该以这样一种方式编写:指针从不指向垃圾,而是指向有效数据或具有NULL值(
free(NULL)
是不可操作的)。

您根本不能。@George我担心会这样。一个想法突然出现在我的脑海中:将第一个init(仅使用mallocing而不使用free)与其他init(我称之为“reinits”)分离开来——因为系统刚刚启动,这是第一次,也是所有的——它们将知道它们位于前一个malloc之后,并且它们可以再次释放指针和malloc后面的内容。Stackoverflow有时通过灵感而不是通过其他人带来答案……你必须对指针进行“簿记”。当不再需要某些东西时,释放它并将指针设置为null。然后在初始化时,任何不为null的指针都是必须释放的有效指针。不要忘记使用purify等工具验证程序是否存在内存泄漏。有一条简单的规则:需要释放所有malloced。如果你有一个指针,但你不知道它是否有效,那么你的程序中就有一个严重的设计错误<代码>无效创建内容(void){free(ptr);ptr=malloc(…)}
<代码>无效清理(void){free(ptr);ptr=NULL;}
。这意味着这些函数可以在任何时间、以任何顺序调用,也可以在整个执行过程中多次调用。它允许在创建和销毁对象时具有更大的灵活性,并且代码始终处于安全状态。同样的“设计模式”也可以用于其他类型的资源,如线程句柄、文件句柄等。所有这些都是很好的实践,没有什么不好的地方。重点是。我把这个警告性的故事稍微缓和了一点。但是不要用
NULL
作为编写草率代码的借口。是的,文件范围是有限的,但这没有什么区别。