c++ 覆盖unique_ptr的删除器

uurv41yg  于 2023-05-08  发布在  其他
关注(0)|答案(1)|浏览(160)

我有下面的C++代码

#include <iostream>
#include <memory>

class MyType{
public:
    ~MyType() {
    std::cout<<"Destructor called";
    }
};

template<typename T>
struct deleter
{
    deleter(void)  {}

    template<typename U>
    deleter(deleter<U> const&, std::enable_if_t<std::is_convertible<U*, T*>::value>* = nullptr) {}

    virtual void operator()(T* p) const 
    {
        std::cout<<"deleter called";
        static_assert(sizeof(T) > 0, "");
        if (p)
        {
            p->~T();
            free(const_cast<std::remove_const_t<T>*>(p));
        }
    }
};

template<typename T>
struct null_deleter : public deleter<T> {
    void operator()(T* ptr) const override {
        // Do nothing
        std::cout<<"null deleter called";
    }
};

template<typename T>
using unique_ptr = std::unique_ptr<T, deleter<T>>;
 
int main()
{
    MyType myType;
    std::cout<<"hello";

    unique_ptr<MyType> u(&myType);
    //unique_ptr<MyType> u(&myType, null_deleter<MyType>());
    u.get_deleter() = null_deleter<MyType>();
    return 0;
}

我有一个需求,我需要覆盖声明为using unique_ptr = std::unique_ptr<T, deleter<T>>;unique_ptr的行为,什么也不做。因此,我扩展了deleter并覆盖了operator()。但我在我的程序中得到下面的错误:

Program returned: 139
Program stderr
free(): invalid pointer

为什么程序仍然调用deleter<T>而不是null_deleter<T>。有什么方法可以覆盖unique_ptr的删除器的行为吗?

j5fpnvbx

j5fpnvbx1#

因为slicing的原因,这不起作用。当你赋值给get_deleter()时,你要做的是复制对象的deleter<T>部分:

Deleter& get_deleter() noexcept;

进位删除器将始终是静态和动态类型deleter<T>Never,of null_deleter<T> if your have an std::unique_ptr<T, delter<T>> .
你不能事后改变。

相关问题