c++ - 如何调用对象的析构函数,如果它的指针地址存储为无符号整数,这是唯一已知的东西?

标签 c++ pointers garbage-collection set

我正在使用 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.

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

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

最佳答案

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

关于c++ - 如何调用对象的析构函数,如果它的指针地址存储为无符号整数,这是唯一已知的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19978684/

相关文章:

C程序返回0xc0000005状态

c - 以下代码崩溃的可能原因?

c++ - 在 C++ 中找到最小数 +ve 数?

c++ - 将抽象类对象从映射存储到抽象类引用

c++ - 是否可以从 std::set 中删除修改后的元素?

c++ - 使用指针替换cpp中字符串中的字符

javascript - 这个作用域/闭包什么时候在 javaScript 中被垃圾收集?

.NET 预分配内存与临时分配

ruby-on-rails - Ruby 中对象销毁的通知

c++ - 为什么这个 "Loop Body"是空的?