在c ++中获取对象ID

时间:2014-09-28 13:11:59

标签: c++ visual-c++ boost

每当从类中实例化一个对象时,我需要捕获它的对象ID。是否有任何提升呼叫可以帮助捕获此信息?

Class1 obj1();
Class2 obj2();

我想知道这些对象是如何存储的,以及是否有与之关联的ID?

修改 这样做的目的是知道对象何时在创建和销毁时跟踪对象。它们中有多少存在,以及它们是否都被正确销毁。

1 个答案:

答案 0 :(得分:2)

如果您需要唯一的对象ID,您应该自己关心此ID。例如,您可以决定所有对象都继承自超类,如

 class ObjectWithId {
    uint64_t _id;
    static uint64_t _counter_;
 protected:
    ObjectWithId() : _id(++_counter_) {};
 /// etc....
 };

但是你应该小心并考虑id应该有副本或移动等等......顺便说一句,上面的类是线程安全。您可能需要原子计数器(使用例如std::atomic)等等......

了解rule of three / rule of five等等......

πάντα ῥεῖ所评论,您可能有时需要persistent ID。它们可以通过一些外部手段提供(例如,通过在数据库中插入新内容然后在每个C ++对象构造中使用该数据库提供的id),或者您可以使用UUID之类的内容,或生成随机字符串,你也可以关心最终重用被毁物体的id。

您也可能只想要非唯一(但通常是不同的)ID,例如如果您只是将它们用于哈希码计算。在实践中,您可能只想使用一些快速PRNG(可能只是lrand48)来获取它们。

请注意,标准C ++ 11 containers 需要任何唯一ID:它们通常需要对包含的类进行一些排序(例如std::set),或者只是哈希码 - 可能是一个相等的测试 - (例如std::unordered_map),并且它们总是提供可能性(通过可选的模板参数)来明确地给出比较和/或哈希函数。

BTW,一个寻找memory leaks的好工具是valgrind(或一些专有的等价物)。您可能应该了解有关smart pointers和C ++标准<memory>标题的更多信息。