我有一张地址图,可以让我用对象存储任意数据。基本上,我正在编写的一个库有一个模板化的函数,它最终用对象存储任意数据。
std::map<void *, MyUserData>
这有效,直到传入的对象被销毁,将其用户数据留在地图中。我也希望删除关联的用户数据,所以我需要以某种方式监听传入对象的析构函数,
一些说明问题的示例代码:
#include <map>
#include <memory>
struct MyUserData
{
int someNum;
};
std::map<void *, MyUserData> myMap;
template <typename T>
registerObject<T>(const std::shared_ptr<T> & _object)
{
static inc = 0;
myMap[(void *)&_object->get()].someNum = inc++;
}
struct MyObject
{
int asdf;
};
int main(int _argc, char ** _argv)
{
auto obj = std::make_shared<MyObject>();
obj->asdf = 5;
registerObject(obj);
obj = 0;
//The user data is still there. I want it to be removed at this point.
}
我目前的解决方案是在 shared_ptr 上设置一个自定义删除器。这通知我何时调用对象的析构函数,并告诉我何时删除关联的用户数据。不幸的是,这需要我的库来创建 shared_ptr,因为没有“set_deleter”函数。它必须在构造函数中初始化。
mylib::make_shared<T>(); //Annoying!
我也可以让用户手动删除他们的对象:
mylib::unregister<T>(); //Equally annoying!
我的目标是能够在没有任何事先注册的情况下懒惰地添加对象。
总而言之,我想检测对象何时被删除,并知道何时从std::map
.
有什么建议么?
PS我是否应该担心将用户数据留在地图中?一个对象被分配到与先前删除的对象相同的地址的可能性有多大?(就我的库而言,它最终会收到相同的用户数据。)
编辑:我认为我最初没有很好地表达我的问题。重写。