我有下面的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的删除器的行为吗?
1条答案
按热度按时间j5fpnvbx1#
因为slicing的原因,这不起作用。当你赋值给
get_deleter()
时,你要做的是复制对象的deleter<T>
部分:进位删除器将始终是静态和动态类型
deleter<T>
。Never,ofnull_deleter<T>
if your have anstd::unique_ptr<T, delter<T>>
.你不能事后改变。