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)
请帮我.
这个免费代码对吗?
如果意图是分配10个字节的内存,那么指定指向该内存的指针,然后删除内存,那么它是正确的.
但是代码中的注释表明你有点困惑.ts.member1 = test;只会使另一个指针指向同一块数据.你没有复制任何东西.从目前看,当你free(test)的话都test和ts.member1在无效的内存指向.
分配的内存测试指向堆,对吧?
是.
测试在.bss?
是.
如果可以在线程中调用testCode()函数,那么test就是一个,对吧?
每次调用该函数时,都会创建一个新的内存块.但同样的功能也是free()记忆.当然,如果另一个线程在第一个线程到达之前获得焦点free(),它将分配另一块内存.例:
所以你有内存泄漏和运行时崩溃.
那么,我可以使用此代码来避免它吗?
对NULL的检查可防止第二个线程分配任何新内存.如果这是意图并且两个线程都应该访问相同的内存,那么它将防止上述错误.但实际内存也必须受到竞争条件的保护,代码变得复杂.执行此操作的正确方法可能是在本地分配所有内容,而不是通过文件范围指针.