我正在使用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.
原则上是否可以调用对象的析构函数,如果我只知道它的地址是作为无符号整数存储的呢?
也许我在设计阶段犯了个错误?对象有不同的类型,我必须存储它们的地址,以便在必要时释放内存,但我也需要调用它们的析构函数。我该怎么处理呢?
发布于 2013-11-14 05:24:18
嗯,我会使用void*
而不是unsigned int
,但是这无助于返回当一个具有已知类型的指针被存储到一个没有该类型信息的容器中时抛出的信息。简而言之,除非您使用类型化指针或通过某种形式的外部信息存储有关指向对象类型的信息,否则不能删除它。
发布于 2013-11-14 05:24:59
如果我只知道它的地址被存储为无符号整数,那么原则上可以调用对象的析构函数吗?
不,因为你不知道对象的类型。
如果您的所有对象都是从CollectableObject基类vith (虚拟析构函数)继承的,那么您可以使用std::set<CollectableObject*> objects
。
https://stackoverflow.com/questions/19978684
复制相似问题