重置std :: shared_ptr是否导致重置其删除程序?

问题描述 投票:0回答:1

也许我误解了c ++中智能指针的某些方面,但是在执行以下代码后:

class cls
{
public:
    class deleter
    {
    public:
        const cls& obj;
        deleter(const cls& c) : obj(c) {}
        void operator()(int* num)
        {
            std::cout << "deleter was called" << std::endl;
            if (num)
            {
                std::cout << "num in deleter: " << *num << std::endl;
                if (*num == *obj.int_ptr)
                {
                    std::cout << "equal " << *num << " = " << *obj.int_ptr << std::endl;
                    delete num;
                }
                else
                    std::cout << "not equal" << std::endl;
            }
        }
    };

std::shared_ptr<int> int_ptr;
cls() : int_ptr(nullptr,deleter(*this)) {}
};

int main()
{
    cls obj;
    obj.int_ptr.reset(new int{15});
    return 0;   
}

输出:

deleter was called

0

我注意到shared_ptr中的reset()删除了自定义删除器,该删除器在其构造函数中传递给它。相反,unique_ptr没有显示这种行为,这对我来说很奇怪。

那么这是怎么回事?

c++ c++11 stl shared-ptr
1个回答
0
投票

删除器在std :: shared_ptr中的存储方式与在std :: unique_ptr中的存储方式不同。 std :: unique_ptr使用空基本优化(EBO)来存储删除程序,这意味着std :: unique_ptr继承了删除程序。 std :: shared_ptr不执行此操作,这就是为什么删除器API在两者之间不同的原因。

© www.soinside.com 2019 - 2024. All rights reserved.