美文网首页
锁不住的析构函数

锁不住的析构函数

作者: 塔塔斯坦 | 来源:发表于2023-06-07 09:58 被阅读0次

2013-08

猜一下这个代码的输出

class Guard
{
    public:
        ~Guard()
        {
            cout<<"guard destructing"<<endl;
        }
};
class Bar
{
    public:
        ~Bar()
        {
            cout<<"bar destructing"<<endl;
        }
};
class Foo
{
    public:
        Bar b;
        ~Foo()
        {
            Guard g;
            cout<<"foo destructing"<<endl;
        }
};
void main(int argc,char **argv)
{
    Foo b;
}

输出

foo destructing  
guard destructing
bar destructing

这个例子说明:析构函数体执行完后,然后析构栈变量,最后开始析构成员变量。
我们真实代码中不是空荡荡的Guard类,,真实代码是这样的:

LocalLicense::~LocalLicense()
{
    ACE_Guard<ACE_Recursive_Thread_Mutex> guard(m_CommonMutex);

    ......

LocalLicense::xxxxx()
{
    ACE_Guard<ACE_Recursive_Thread_Mutex> guard(m_CommonMutex);
    ......

用ACE_Guard来包装mutex锁,可以保证锁的自动释放,这是我们常用的。这里试图用一个锁来同步析构函数和成员方法,这样就有问题了。结合上个例子:当栈变量ACE_Guard被析构后,锁已经释放,然后才开始析构局部变量,此时成员函数可以获得锁并继续执行,如果成员函数也访问同一个局部变量(此时可能正在被析构),结果就是数据不一致,严重的可能导致coredump,挂死。

写了一个例子来模拟,见附件,自己用main方法调用其中的guard_in_destructor,在linux和windows上发生coredump,solaris上挂住

  • 关于解决方法

参考网上的一篇文章《当析构函数遇到多线程──C++ 中线程安全的对象回调》。里边推荐了使用shared_ptr,还有很多注意事项。

shared_ptr这个不能完全套用到项目中,新开发的可以参考这样写,但我们实际解决方法需要因地制宜,比如用土办法,锁然后加if(xx!=null)。否则实际要改动的可能很多,风险更大。

相关文章

  • C++之析构函数

    析构函数的概述 析构函数 完成对象的清理工作,先清理,再释放对象空间。析构函数也是编译器自动调用。 析构函数 不能...

  • 简介python中的析构函数与构造函数

    python的构造和析构函数为固定的名字。 构造函数 析构函数 不像c++中那样构造函数和析构函数是类名字。并且在...

  • C++基础-构造函数和拷贝函数

    构造函数 析构函数 析构函数: 相当于临终遗言,对象被回收的时候会被调用。如果有在对象内部开辟堆内存,在析构函数里...

  • 2020-02-10 C++基础2

    1:为什么析构函数必须是虚函数?为什么C++默认的析构函数不是虚函数? 将可能会被继承的父类的析构函数设置为虚...

  • C++总结

    函数 为什么基类的析构函数用虚函数 在实现多态时,当用基类操作派用类,在析构时防止只析构基类而不析构派生类的状况发...

  • [C++之旅] 13 析构函数

    [C++之旅] 13 析构函数 析构函数与构造函数相反,构造函数在实例化一个对象时调用,而析构函数在销毁一个对象时...

  • C++三五法则

    1、需要析构函数的类也需要拷贝构造函数和拷贝赋值函数。 通常,若一个类需要析构函数,则代表其合成的析构函数不足以释...

  • 析构函数

    析构函数与构造函数相反,在一个类的实例被释放之前,析构函数被调用,析构函数使用关键字deinit来定义,类似于初始...

  • C++ 析构函数

    析构函数(destructor)是一种特殊的成员函数。 类的析构函数名是在类名前加一个波浪好~ 累的析构函数是在删...

  • 构造函数

    构造函数 构造函数的数组的应用 类中包含类,并且给类传参 析构函数(逆构造函数):每个构造函数都析构函数,谁最先构...

网友评论

      本文标题:锁不住的析构函数

      本文链接:https://www.haomeiwen.com/subject/heqgedtx.html