C++ 高级话题,关于内存重复释放问题,释放后还继续使用问题,被void*转换后继续释放问题等

直接上代码:整个项目中由于使用了引用计数机制,而导致内存重复被释放,多线程锁对引用计数的控制等问题极具暴露出来,所以出现了一下等情况的报错。


/C++面试题
#if 1
struct MyStruct
{
    MyStruct(float _f, int _n)
    {
        cout << "MyStruct::MyStruct" << endl;
        f = _f;
        n = _n;
    }

    virtual ~MyStruct()
    {
        cout << "MyStruct::~MyStruct" << endl;
    }
    float f;
    int n;
};

int _tmain(int argc, _TCHAR* argv[])
{
    //下列程序会有什么问题?
    MyStruct* ps = new MyStruct(1.0, 2);
    void* pv = (void*)ps;  

    delete ps;                                      // 1. 不转会调用~MyStruct()
    
    /*
    * delete ps;                                    // 2. 多次调用析构函数~MyStruct(),会double delete
    * Unhandled exception at 0x00A79259 in 函数调用操作符的声明与定义.exe: 0xC0000005: Access violation reading location 0xFEEEFEEE.
    */

    delete pv;                                      // 3. 不能调用~MyStruct() 不管是否为virtual
    ps->f = 2.0;                                    // 4.                     
    ps->n = 3;                                      // 5. 
    cout << ps->n << endl;                          // 6. 

    ///
    void* pf = new float(3.0);                        // 对内存地址进行重新格式解析
    cout << *(int*)pf << " " << int(*(float*)pf) << endl;

    system("pause");
    return 0;
}
#endif

结论:

1.  调用~MyStruct析构函数

2. 重复delete ps对象-》

3.  通过指针void*转换后调用delete pv;  不会调用~MyStruct的析构函数,重复释放会报错。

4.5.6. 会引发一些异常

点击Break之后

再点continue 或者 F5 会执行后续代码,直接点击continue 也就不用进去上面截图,直接运行后续代码。

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

隨意的風

如果你觉得有帮助,期待你的打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值