首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如果对象的指针地址存储为无符号整数,那么如何调用对象的析构函数?

如果对象的指针地址存储为无符号整数,那么如何调用对象的析构函数?
EN

Stack Overflow用户
提问于 2013-11-14 05:18:05
回答 2查看 244关注 0票数 0

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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.

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-14 05:24:18

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

票数 3
EN

Stack Overflow用户

发布于 2013-11-14 05:24:59

如果我只知道它的地址被存储为无符号整数,那么原则上可以调用对象的析构函数吗?

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19978684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文