C++ 实现智能指针my_auto_ptr支持指针剥离及函数间传递

摘要:

本文提出了一种自定义智能指针类my_auto_ptr,解决了标准智能指针在指针剥离和传递方面的局限性。该实现利用shared_ptr管理指针地址而非直接管理对象,既保留了指针的可传递性(通过共享地址计数),又提供了类似auto_ptr的release()功能。核心特点是:1) 通过共享指针存储指针地址而非对象本身;2) 最后一个持有者自动释放内存;3) 支持指针剥离和重置操作。这种设计在需要跨函数或信号槽传递指针时特别有用,弥补了unique_ptr不可复制和shared_ptr无法释放所有权的不足。

C++标准中的auto_ptr在C++11以后已经不建议使用了,在C++17中已经移除,规范中推荐使用 unique_ptr、shared_ptr 和 weak_ptr 。

但是在实际使用过程中,想从shared_ptr中将指针剥离出来,在其他地方管理,由于shared_ptr没有release方法,无法实现。

unique_ptr中有release方法,但是想在函数间或Qt信号槽间传递,由于unique_ptr的独占性,不允许复制传递,无法实现。

现利用shared_ptr只将指针的地址管理起来,便于指针剥离,也不影响函数间传递:


template <class _Ty>
class my_auto_ptr 
{
public:
    my_auto_ptr()
        : m_ptrInt(std::make_shared<qint64>(0))
    {
    }
    my_auto_ptr(_Ty* ptr)
        : m_ptrInt(std::make_shared<qint64>((qint64)ptr))
    {
    }
    ~my_auto_ptr()
    {
        if (m_ptrInt.use_count() == 1)
        {
            auto temp = get();
            if (temp)
            {
                delete temp;
                temp = nullptr;
            }
        }
    }

    _Ty* operator->() const noexcept
    {
        return get();
    }
    _Ty* get() const noexcept
    {
        auto ptr = reinterpret_cast<_Ty*>(*m_ptrInt);
        return ptr;
    }

    _Ty* release()
    {
        auto temp = get();
        *m_ptrInt = 0;
        return temp;
    }

    void reset(_Ty* _Px)
    { 
        my_auto_ptr(_Px).swap(*this);
    }
    void swap(my_auto_ptr& _Other) noexcept
    {
        m_ptrInt.swap(_Other.m_ptrInt);
    }

private:
    std::shared_ptr<qint64> m_ptrInt;
};

7z压缩:

N3q8ryccAASqzXHhZwIAAAAAAABqAAAAAAAAAFa4SFrgJS4CX10AEZpIxxCTF979vi2Cvg+NUPKIDCRg9eUCGRhL7qjXZ2UVVqySZBZbTUQaGv7zhbd7To5KKUdWPghyUTQQPyQpOdljhQ/g5p4+rIQA5EWvGVNJGpC0CxgNfNMhZjhFDd8OBhaVAMR9SwBqso8vPf60YR5qQb0+ywbgZSeCG1jdHp2nZ4WO/6GQBFSu+93KWlFFECkvErEOfMpC/Mx+QO5/vkIAlBbBz5DiTACBejv+07Tb4DNCV8/C5RtIkyONh9DGNqR+XocGI0Yu+D6iQkiDXVm3o42QiciAN0gZste4pK8tnEGjoMMGYzDnMM57IHCC2ePyFY9zkVEIbfYLJkeEH6BzDC7Qzsij9/W4xyBlnZZxbElnlsTnvWGPLWosaClZbKfzjCEpnlE7599qKijmJyuVpMO3ChBHcHfmZbLTUTHh4lez9RLKPaOnWWVMDX0B587ISbVDnnni0Oc0C+GycCObopoNbUxoKXsYkk2h28e0yulFyu+zHfViUkjYKJgvbzS3KLcnDssDs1PtR57WPqQPzyTwMm6TKgV7bUz7M6QlJ5vbqNnMMuu9Ijvwp3k4aoD2xDrAZEZxBhsg0UQyK+3XSI7aQlRw41MGCLabaLgE/GDKwHFvkwl2lkxapcAQvvIjI7GHjJPg50MyJ1QWGV0QoUHZaiVUwdAvmF7hGPK++cb+ABnkbpVtMi8VrKiGIc7mxQy4HqFUtw2JkWkyTdEyZTIhYrEgWh1hCC+vSI9jpe4j+QysJAJWHV1VdgASSIeK05n7pWkx6QaYtDm/mYywNyfAhOIA8LbLzv4AAAABBAYAAQmCZwAHCwEAASEhAQMMpS8ACAoBFPH1qAAABQEZCgAAAAAAAAAAAAARIQBtAHkAXwBzAGgAYQByAGUAZABfAHAAdAByAC4AaAAAABkCAAAUCgEAW0KzonxR3AEVBgEAIAAAAAAA

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值