在C中,如何释放全局静态指针?

use*_*766 4 c free static pointers

在C中,请查看此代码,

static char* test = NULL;
typedef struct
{
    char* member1;
}TestStruct;


void testCode()
{
    TestStruct ts;
    test = malloc(10*sizeof(char));
    //assign characters to each test 0 ~ 9 positions 
    ts.member1 = test;
    // using ts, then can I free static pointer test using free()?
    free(test);
}
Run Code Online (Sandbox Code Playgroud)

1)这个免费代码是对的吗?
2)分配的内存测试指向堆,对吗?
3)测试是在.bss?
4)如果testCode()函数可以在线程中调用,测试就是一个,对吗?但每次线程调用testCode()时,测试都会被赋予新指针并使内存泄漏,对吗?那么,我可以使用此代码来避免它吗?

 Mutex_Start
 if(test == NULL)
     test = malloc(10*sizeof(char));
 Mutex_End
Run Code Online (Sandbox Code Playgroud)

请帮我.

Lun*_*din 5

这个免费代码对吗?

如果意图是分配10个字节的内存,那么指定指向该内存的指针,然后删除内存,那么它是正确的.

但是代码中的注释表明你有点困惑.ts.member1 = test;只会使另一个指针指向同一块数据.你没有复制任何东西.从目前看,当你free(test)的话都testts.member1在无效的内存指向.

分配的内存测试指向堆,对吧?

是.

测试在.bss?

是.

如果可以在线程中调用testCode()函数,那么test就是一个,对吧?

每次调用该函数时,都会创建一个新的内存块.但同样的功能也是free()记忆.当然,如果另一个线程在第一个线程到达之前获得焦点free(),它将分配另一块内存.例:

  • 线程1:地址1234处的malloc内存
  • 测试指向1234
  • 上下文切换
  • 线程2:地址5678处的malloc存储器
  • 测试指向5678
  • 什么都没有指向1234 - 内存泄漏
  • 线程2:地址为5678的空闲内存.注意:free()不会将指针设置为NULL.
  • 线程2:完成
  • 线程1:地址为5678的空闲内存(测试仍然指向那里)
  • 线程1:崩溃和烧伤

所以你有内存泄漏和运行时崩溃.

那么,我可以使用此代码来避免它吗?

对NULL的检查可防止第二个线程分配任何新内存.如果这是意图并且两个线程都应该访问相同的内存,那么它将防止上述错误.但实际内存也必须受到竞争条件的保护,代码变得复杂.执行此操作的正确方法可能是在本地分配所有内容,而不是通过文件范围指针.

  • 他在分配内存之前检查是否测试== NULL,所以如果它被分配,它将不再分配它,不是吗? (2认同)