pure virtual method called(__cxa_pure_virtual)崩溃

纯虚函数,在子类中实现,在父类中某个线程调用,线程的调用的结束在父类的析构函数中;
导致__cxa_pure_virtual崩溃pure virtual method called

直接上demo代码,详见父类A的purefunc

/*
 * 纯虚函数,在子类中实现,在父类中某个线程调用,
 * 线程的调用的结束在父类的析构函数中;
 * 导致__cxa_pure_virtual崩溃pure virtual method called
 * #0  0x00007fc689aa5387 in raise () from /lib64/libc.so.6
 * #1  0x00007fc689aa6a78 in abort () from /lib64/libc.so.6
 * #2  0x00007fc68ff9a7d5 in __gnu_cxx::__verbose_terminate_handler() () from /lib64/libstdc .so.6
 * #3  0x00007fc68ff98746 in ?? () from /lib64/libstdc .so.6
 * #4  0x00007fc68ff98773 in std::terminate() () from /lib64/libstdc .so.6
 * #5  0x00007fc68ff992df in __cxa_pure_virtual () from /lib64/libstdc .so.6
 */

#include <stdlib.h>
#include <stdio.h>
#include <thread>

class A
{
public:
    A() : bThreadRunning(false) 
    {}

    virtual ~A()
    {
        fprintf(stderr, "dtor A start.\n");
        std::this_thread::sleep_for(std::chrono::seconds(2));

        fprintf(stderr, "dtor A freeing thread.\n");
        bThreadRunning = false;
        if (pt)
        {
            if (pt->joinable())
            {
                pt->join();
                delete pt;
                pt = NULL;
            }
        }
    }

    virtual void purefunc() = 0;
    // {
    //     fprintf(stderr, "A purefunc.\n");    // 避免崩溃的方式,就是在父类中进行默认的实现。当子类析构了,执行父类的实现
    // }

    void start()
    {
        bThreadRunning = true;
        pt = new std::thread(std::bind(&A::threadrun, this));
        if (pt)
            fprintf(stderr, "start thread success.\n");
    }

private:
    void threadrun()
    {
        int i = 0;
        while(bThreadRunning)
        {
            std::this_thread::sleep_for(std::chrono::seconds(1));
            fprintf(stderr, "sub-thread sleep %d seconds\n", ++i);
            purefunc();
        }
    }

private:
    bool bThreadRunning;
    std::thread *pt;
};


class B : public A
{
public:
    B() = default;
    virtual ~B(){
        fprintf(stderr, "dtor B.\n");
    }

    virtual void purefunc()
    {
        fprintf(stderr, "purefunc B.\n");
    }
};

int main()
{
    B *b = new B();
    b->start();

    for(int i = 0; i < 10; i++)
    {
        std::this_thread::sleep_for(std::chrono::seconds(1));
        fprintf(stderr, "main thread sleep %d seconds\n", i);
    }

    delete b;

    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值