c++ - 如何将析构函数分配给指针?

标签 c++

我正在编写一个内存管理库,需要显式调用析构函数,在我的设计中我有一个指向对象的析构函数方法的指针,我编写如下代码:

void (*p)() = foo.~Foo;

但是我得到了

error: cannot convert ‘Foo::~Foo’ from type ‘void (Foo::)() noexcept’ to type ‘void (*)()’

我尝试了其他格式,例如 void (Foo::(*p))() noexcept = foo.~Foo; 但失败了。

那么将析构函数分配给指针的正确方法是什么?

编辑: 在运行时我的代码不知道它在我的堆中是什么类型,所以我不能使用 foo.~Foo()。我需要一个适合所有析构函数的生成指针,这可能吗?

最佳答案

解决方案:使用模板包装器

不允许获取析构函数的地址。

但是,您可以创建一个非常简单的模板函数并使用它:

template<class T>
void destruct(const T* x) {
    x->~T();
}

现在,只需从以下位置获取指针:

destruct<Foo>

您可以使用例如。 std::bind (或 lambda)如果您需要绑定(bind)到实际对象:

std::bind(&destruct<Foo>, foo_ptr);

请注意,一旦绑定(bind),它就无法转换为原始函数指针。

关于c++ - 如何将析构函数分配给指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58556130/

相关文章:

c++ - 能不能通过const函数实现多态呢?

c++ - 有什么方法可以检测我的类的对象是否在堆栈上创建?

c++ - 删除 "Customize Quick Access Toolbar"按钮

c++ - Cuda atomicInc 不工作

c++ - 静态常量字符串数组,如何使用

c++: 无法解决 vector 订阅错误

javascript - Firefox 4 是否实现任何插件架构更改

c++ - 这个 DWORD 相关代码是未定义行为吗?

c++ - 在计算着色器中使用深度纹理

C++ 11 lambda作为成员变量?