0

我正在使用 c++ 编写一个垃圾收集库。对象的析构函数作为终结器工作,当对象的内存被释放时释放对象的内部数据。std::set指针地址作为无符号整数存储在集合 ( ) 中:

std::set<unsigned int> addresses;

C1* c1 = new C1();
C2* c2 = new C2();

addresses.insert(*c1);
addresses.insert(*c2); // so now pointer's addresses are stored in the set

当需要释放对象时,我想调用析构函数:

std::set<unsigned int>::iterator it = addresses.begin(); // for example delete the first one
/* 1st variant */ delete *it; // not working, because "unsigned int is not a pointer type"
/* 2nd variant */ delete (void*)(*it); // frees memory, but doesn't call the destructor.

原则上是否可以调用对象的析构函数,如果我唯一知道的是它的地址,它存储为无符号整数?

也许我在设计阶段犯了一个错误?对象有不同的类型,我必须存储它们的地址以在必要时释放内存,但我还需要调用它们的析构函数。我该如何处理?

4

2 回答 2

3

嗯,我会使用void*而不是unsigned int,但这无助于取回在将具有已知类型的指针存储到没有类型信息的容器中时丢弃的信息。简而言之,除非您使用类型化指针或通过某种形式的外部信息存储有关指向对象类型的信息,否则您无法删除它。

于 2013-11-14T13:24:18.780 回答
1

原则上是否可以调用对象的析构函数,如果我唯一知道的是它的地址,它存储为无符号整数?

不,因为您不知道对象的类型。

如果您的所有对象都是从带有虚拟析构函数的 CollectableObject 基类继承的,那么您可以使用std::set<CollectableObject*> objects.

于 2013-11-14T13:24:59.530 回答