相关疑难解决方法(0)

在释放它们之后真的应该将指针设置为"NULL"吗?

似乎有两个论点为什么人们应该NULL在释放它们之后设置指针.

双重释放指针时避免崩溃.

简短:free()不小心召唤第二次,当它被设置为时,不会崩溃NULL.

  • 几乎总是这掩盖了一个逻辑错误,因为没有理由free()第二次调用.让应用程序崩溃并能够修复它会更安全.

  • 它不能保证崩溃,因为有时在同一地址分配新内存.

  • 当有两个指向同一地址的指针时,主要发生双重自由.

逻辑错误也可能导致数据损坏.

避免重用已释放的指针

短:malloc()除非释放指针设置为,否则访问释放的指针可能会导致数据损坏,如果在同一位置分配内存NULL

  • NULL如果偏移足够大(someStruct->lastMember,theArray[someBigNumber]),则无法保证在访问指针时程序崩溃.而不是崩溃将导致数据损坏.

  • 将指针设置为NULL无法解决具有相同指针值的不同指针的问题.

问题

这是一篇反对NULL在释放后盲目设置指针的帖子.

  • 哪一个更难调试?
  • 是否有可能抓住两者?
  • 这种错误导致数据损坏而不是崩溃的可能性有多大?

随意扩展这个问题.

c free pointers

48
推荐指数
3
解决办法
3万
查看次数

为什么在释放指针后取消引用时会得到不同的结果?

我对C中的内存管理(以及Debian GNU/Linux下的GCC 4.3.3)提出了疑问.

根据K&R的C编程语言书(第7.8.5节),当我释放指针然后取消引用它时,是一个错误.但是我有些怀疑,因为我注意到有时候,就像我在下面粘贴的源代码一样,编译器(?)似乎按照定义明确的原则工作.

我有一个像这样的简单程序,它显示了如何返回动态分配的数组:

#include <stdio.h>
#include <stdlib.h>


int * ret_array(int n)
{
    int * arr = (int *) malloc(10 * sizeof(int));
    int i;
    for (i = 0; i < n; i++)
    {
        arr[i] = i*2;
    }
    printf("Address pointer in ret_array: %p\n", (void *) arr);
    return arr;
}

int * ret_oth_array(int n)
{
    int * arr = (int *) malloc(10 * sizeof(int));
    int i;
    for (i = 0; i < n; i++)
    {
        arr[i] = i+n;
    }
    printf("Address pointer …
Run Code Online (Sandbox Code Playgroud)

c malloc free gcc memory-management

2
推荐指数
3
解决办法
1321
查看次数

标签 统计

c ×2

free ×2

gcc ×1

malloc ×1

memory-management ×1

pointers ×1