安全的内存管理 - C.

5 c memory-management

我正在网上寻找安全管理内存分配/释放的一些指导方针.但是找不到一些好的来源.

我想也许在这个网站上堆积一个也许是个好主意.我可以从一些开始,表明我的意思,也许有人可以"改进"它,以便我们有一个完整的指南列表,帮助我们确保(在最大程度上)我们正确地管理内存.

示例:

  1. 始终在声明时初始化指针.

    int*p = NULL;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 检查malloc的返回类型

    int *p = malloc(sizeof(int));
    if(p==NULL)
    {
      /* do some error handling*/
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 每个都malloc应该有对应的free

  4. 可能的问题是两次释放内存.怎么避免呢?删除后将指针指定为NULL.

    free(p);
    p=NULL;
    
    Run Code Online (Sandbox Code Playgroud)

    注意:正如注释中所指出的,如果一个对象有两个指针,这就无法保护.它已经使用其中一个指针释放了.

  5. 另一个可能的问题是释放包含一些垃圾或无法由malloc分配的空闲内存的内存.怎么避免呢?AFAIAC这不容易检查.鉴于程序员遵循前面的步骤,他/她应该另外检查没有随机/坏内存被分配给指针.

否则,如果遵循这些指导原则,这似乎是非常安全的方式来管理我的内存.

有任何想法吗?建议?

nou*_*ney 5

编辑:问题已经发生了很大的变化,所以这里有一个"第一"问题的样本:

在本指南中,我看到的一个问题是,如果在某种malloc情况下,在自由指针之后和之前分配了一些随机垃圾内存 - 在这种情况下,程序员应该确保不会发生这种情况.否则free将尝试释放垃圾内存并可能崩溃.

只需使用const指针!

int * const p = malloc(sizeof(int));
if(p==NULL)
{
   /* do some error handling*/
}

/* do what you want with p, but you won't be able to change its value */

free(p);
Run Code Online (Sandbox Code Playgroud)

您不需要初始化pNULL,因为如果发生错误则malloc()返回NULL.

您不需要检查是否p为NULL,free()将为您检查.