有没有办法确定free()是否会失败?

jld*_*ont 2 linux malloc free shared-memory

有没有办法确定如果free()调用某个内存块指针是否会失败?

我有以下情况:有权访问共享资源的线程失败,可能处于释放所述资源的状态.现在我需要设计一种安全的方法来清理这个共享资源.

当然,我已经为正常情况分配了资源的所有权,但是上述限制情况呢?

更新:如果我使用其他同步机制,它只会做更多的清理工作,并可能涉及额外的限制条件.如果可能的话,我想限制/避免这些.

解决方案:我最终决定进行重新分解.感谢所有贡献者.你们好棒!

Tim*_*ost 6

我见过各种各样的尝试,包括这一次:

void m_free(void **p)
{
        if (*p != NULL) {
                free(*p);
                *p = NULL;
        }
}
Run Code Online (Sandbox Code Playgroud)

取消引用类型惩罚指针不仅打破了各种平台,"插入这个示例"只有在初始化,释放和重新初始化每个现有函数(包括已编译的库)中的每个指针时才能工作,并使用C库做同样的事.

然后,处理优化和锁定免费线程安全问题.呸!

简而言之,如果您无法跟踪您在单个函数中分配的内容,则需要时间来重新考虑该函数.做得那么......你会发现对更安全的免费()的需求很快消失了.如果在一个支持的平台上工作,Valgrind就是你的朋友.根据你的标签,它真的是你的朋友:)

或者,使用malloc()自费运行垃圾收集,具体取决于您如何分配事物并完全摆脱free().之后,调试变得几乎终极有趣.

希望你能重新考虑?虽然您似乎也存在互相排斥的问题,但它只会导致重新分解.即,让free()之前的行阻塞,或者在尝试获取锁时失败..并且在具有锁的线程中将释放的指针设置为NULL,至少在您实现的结构中.