c - C中如何释放全局静态指针?

标签 c pointers static free

在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);
}

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

 Mutex_Start
 if(test == NULL)
     test = malloc(10*sizeof(char));
 Mutex_End

请帮帮我。

最佳答案

Is this free code right?

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

但是代码中的注释表明您有点困惑。 ts.member1 = test; 只会让另一个指针指向同一 block 数据。你没有制作任何东西的硬拷贝。从您 free(test) 的那一刻起,testts.member1 都指向无效内存。

Allocated memory test pointing is in heap, right?

是的。

test is in .bss?

是的。

if testCode() function can be called in thread, test is one, right?

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

  • 线程 1:地址 1234 处的 malloc 内存
  • 测试指向 1234
  • 上下文切换
  • 线程 2:地址 5678 处的 malloc 内存
  • 测试指向 5678
  • 不再有任何东西指向 1234 - 内存泄漏
  • 线程 2:地址 5678 处的空闲内存。注意:free() 不会将指针设置为 NULL。
  • 线程 2:完成
  • 线程 1:地址 5678 处的空闲内存(测试仍指向那里)
  • 线程 1:崩溃与燃烧

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

So, can I use this code to avoid it?

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

关于c - C中如何释放全局静态指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21552796/

相关文章:

c - Linux 原始套接字 - ip header 中的字节顺序

c - 指向自定义地址

c++ - 指针初始化

php - 覆盖 PHP 中的静态方法

javascript - SVG 动画不适用于静态文件夹/地 block

c - 如何在 linux 中为 c 程序分配更多的 cpu 和 RAM

c - Valgrind 中抑制泄漏意味着什么?

c - 指针作为 C 中的函数参数

c - 在 C 中调整静态数组的大小

c - 在 C 中打印整数的 Char 数组