每當一個對象從一個類實例化時,我需要捕獲它的對象ID。有沒有任何助推電話可以幫助捕捉這些信息?在C++中獲取對象ID
Class1 obj1();
Class2 obj2();
我想知道這些對象是如何存儲的,以及是否存在與其關聯的ID?
編輯: 這樣做的目的是要知道當對象被創建和銷燬時跟蹤對象。有多少人在場,是否所有人都能正常銷燬。
每當一個對象從一個類實例化時,我需要捕獲它的對象ID。有沒有任何助推電話可以幫助捕捉這些信息?在C++中獲取對象ID
Class1 obj1();
Class2 obj2();
我想知道這些對象是如何存儲的,以及是否存在與其關聯的ID?
編輯: 這樣做的目的是要知道當對象被創建和銷燬時跟蹤對象。有多少人在場,是否所有人都能正常銷燬。
如果您需要獨特的對象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,例如,如果你只是用它們進行哈希碼計算。在實踐中,你可能只想使用一些快速的PRNG(或許只是lrand48
)來獲得它們。
注意,標準C++ 11 containers做不不需要任何獨特ID:他們經常要在包含類的一些排序(如std::set),或者僅僅是一個散列碼 - 有可能是一個平等的測試 - (例如std::unordered_map ),並且它們總是給出可能性(通過可選的模板參數)以明確地給出比較和/或散列函數。
順便說一句,尋找memory leaks的好工具是valgrind(或一些專有的等價物)。您可能應該詳細瞭解smart pointers和C++標準<memory>
標題。
如果該對象實例表示某些東西,應該跨越進程邊界使用此解決方案將無濟於事。至少應該提到例如數據庫引擎或UUID機制也提供_Object-ID_'s。 – 2014-09-28 13:29:28
@πάνταῥεῖ:謝謝,我改進了我的答案。 – 2014-09-28 13:47:42
C++中沒有內置對象ID。而你的「對象」實際上是函數聲明。 – juanchopanza 2014-09-28 13:13:00
「對象ID」是什麼意思? – 5gon12eder 2014-09-28 13:14:26
你應該編輯你的問題來解釋*爲什麼*你需要這樣的對象id! – 2014-09-28 13:46:08