安全的内存管理 - C.

时间:2014-03-31 10:32:54

标签: c memory-management

我正在网上寻找一些安全管理指南 C上的内存分配/释放但是找不到一些 好消息来源。

我想也许在这个网站上堆积一个也许是个好主意。 我可以从一些开始,表明我的意思,也许有人可以 “改进”它,以便我们有一份完整的指南清单 帮助我们确保(在最大程度上)我们正确管理记忆。

示例:

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

    int*p = NULL;
    
  2. 检查malloc的返回类型

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

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

    free(p);
    p=NULL;
    

    注意:正如评论中所指出的,如果一个对象有两个指针,这不会保护。它已经使用其中一个指针释放了。

  5. 另一个可能的问题是释放内存   包含一些未由malloc分配的垃圾或空闲内存。   怎么避免呢?   AFAIAC这不容易检查。   鉴于程序员遵循前面的步骤,   他/她应该另外检查没有随机/坏   内存被分配给指针。
  6. 否则,如果遵循这些指导原则,这似乎是非常安全的管理方式 记忆对我来说。

    有什么想法吗?建议?

2 个答案:

答案 0 :(得分: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);

您无需将p初始化为NULL,因为如果发生错误,malloc()会返回NULL

您无需检查p是否为空,free()会为您检查。

答案 1 :(得分:0)

唯一的答案是纪律。确保每个malloc(3)都有相应的free(3)。这意味着定义一些策略(这些变量在哪里创建和初始化,它们在哪里销毁)并严格遵循它。定义负责管理每个变量的程序部分。

有一些工具可以帮助检测问题(例如,valgrind),但之后修复混乱是 hard