是否可以在不知道类型的情况下调用析构函数
Is it possible to call the destructor without knowing the type?
是否可以在不知道类类型的情况下调用对象的析构函数而不使用delete
?我问是因为我正在研究一个分配器(为了好玩/练习),并且我正在使用malloc
/放置new
来构造对象,但是当我去破坏对象时,我很好奇是否有办法在不知道类型的情况下这样做。如果不可能,为什么不呢?唯一的方法是我在示例代码中显示的方式(已注释掉)?
#include <stdio.h>
#include <new>
void* SomeAllocationFunction(size_t size) {
return malloc(size);
}
class SomeClass{
public:
SomeClass() {
printf("Constructedn");
}
~SomeClass() {
printf("Destructedn");
}
};
int main(void){
void* mem = SomeAllocationFunction(sizeof(SomeClass));
SomeClass* t = new(mem)SomeClass;
free(t);
//t->~SomeClass(); // This will call the destructor, is it possible to do this without knowing the class?
return 0;
}
(我知道我可以调用删除,但请暂时忽略它。
不,如果不知道类型(或知道具有虚拟析构函数的对象基类型之一),这是不可能的。
通常,自定义分配器既不构造也不销毁对象,尽管有些分配器围绕分配器制作模板化包装器,以执行放置新或直接析构函数调用。
(从技术上讲,您可以将一个函数指针与每个分配相关联,该指针最终调用类型的析构函数。但这相当粗略,我不推荐它。
不,在不知道类的情况下不能调用析构函数,因为编译器不知道要调用哪个析构函数。您可以:
- 使所有对象都继承自具有虚拟析构函数的某个基对象,并使用该基对象指针而不是 void 指针
- 利用模板
- 让分配器本身不管理构造函数/析构函数的调用
在非类型化的内存上调用析构函数比在没有类型的情况下调用构造函数(即:放置新)的可能性更大。构造函数和析构函数都是对象的一部分,编译器需要一个类型来知道要调用什么。
截至 C++17 年,这在 std::destroy_at
中成为可能。请参阅 CPP 参考。
相关文章:
- 如果 std::vector::clear() 不是静态的,如何在没有实例的情况下调用它?
- C++ - 如何在不调用其属性的情况下调用类?
- C++ 在不释放内存的情况下调用析构函数
- Python在不引用类名的情况下调用类函数
- 为什么在这种情况下调用非常量右值移动构造函数?
- 是否可以在没有显式专用化的情况下调用可变参数模板函数?
- 使用按引用调用时,不能在没有对象的情况下调用成员函数 const
- 您可以在不调用构造函数的情况下调用攻击器吗?
- 命名空间:不能在没有对象的情况下调用成员函数
- 哪些语言将在没有显式桥接的情况下调用C++
- 如何在不重新索引顶点的情况下调用"boost::remove_vertex"?
- C :在没有对象实例的情况下调用非静态成员函数
- 在不实例化的情况下调用不同派生类的虚拟方法
- C 如何在没有错误的情况下调用void函数
- 在MSVC上的数组初始化期间,destructor在不复制或移动构造方的情况下调用
- 在不指定实例化的情况下调用类模板的静态方法的方法
- 为什么INVOKE总是取消引用数据成员,而不是在可能的情况下调用
- 是否可以在不实例化派生类的情况下调用该类的虚拟函数
- 无法在没有对象的情况下调用成员函数(尽管我相信我确实初始化了它)
- 为什么在没有赋值运算符的情况下调用转换构造函数