每当从类中实例化一个对象时,我需要捕获它的对象ID。是否有任何提升呼叫可以帮助捕获此信息?
Class1 obj1();
Class2 obj2();
我想知道这些对象是如何存储的,以及是否有与之关联的ID?
修改 这样做的目的是知道对象何时在创建和销毁时跟踪对象。它们中有多少存在,以及它们是否都被正确销毁。
答案 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>
标题的更多信息。