2

是否可以在不知道类类型而不使用的情况下调用对象的析构函数delete?我问是因为我正在研究分配器(为了好玩/练习)并且我正在使用malloc/放置new来构造对象但是当我去破坏对象时,我很好奇是否有办法在不知道的情况下这样做类型。如果不可能,为什么不呢?唯一的方法是我在示例代码中显示的方式(被注释掉)吗?

#include <stdio.h>
#include <new>

void* SomeAllocationFunction(size_t size) {
    return malloc(size);
}

class SomeClass{
public:
    SomeClass() {
        printf("Constructed\n");
    }

    ~SomeClass() {
        printf("Destructed\n");
    }
};

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;
}

(我知道我可以直接调用 delete,但请暂时忽略它。)

4

3 回答 3

2

不,你不能在不知道类的情况下调用析构函数,因为编译器不知道要调用哪个析构函数。您可以:

  • 使所有对象都从具有虚拟析构函数的某个基础对象继承,并使用该基础对象指针而不是 void 指针
  • 使用模板
  • 让分配器本身不管理构造函数/析构函数的调用
于 2012-04-18T23:52:29.103 回答
2

在无类型的内存上调用析构函数与调用没有类型的构造函数(即:placement new)一样不可能。构造函数和析构函数都是对象的一部分,编译器需要一个类型来知道要调用什么。

于 2012-04-18T23:52:37.007 回答
2

不,如果不知道类型(或知道具有虚拟析构函数的对象的基类型之一),这是不可能的。

通常来说,自定义分配器既不构造也不破坏对象,尽管有些分配器围绕执行放置 new 或直接析构函数调用的分配器进行模板化包装。

(Technically, you could associate with every allocation a function pointer that ends up calling the type's destructor. But that's fairly sketchy, and I wouldn't recommend it.)

于 2012-04-18T23:52:40.107 回答