Is this free code right?
如果意图是分配10个字节的内存,那么指定指向该内存的指针,然后删除内存,那么它是正确的.
但是代码中的注释表明你有点困惑. ts.member1 = test;只会使另一个指针指向同一块数据.你没有复制任何东西.从你释放(测试)的那一刻起,test和ts.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()之前获得焦点,它将分配另一块内存.例:
>线程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的检查可防止第二个线程分配任何新内存.如果这是意图并且两个线程都应该访问相同的内存,那么它将防止上述错误.但实际内存也必须受到竞争条件的保护,代码变得复杂.执行此操作的正确方法可能是在本地分配所有内容,而不是通过文件范围指针.