# ObjectBaseInfo size_t hash_code; ///<对象数据类型的hash值 ObjectManager * object_manager; ///<对象管理器 size_t serial_number; ///<对象序列号 SourceCodeLocation source_code_location; ///<对象创建的源代码位置 其中hash_code使用typeid(Object).hash_code()方式获取 serial_number则为唯一序列号 Object类将ObjectBaseInfo信息放至于类的最前方,目的在于当一个Object无法识别时:可以根据ObjectBaseInfo信息进行最简单的甄别。 在较为极端的情况下,我们可以在每个Object的创建时,向日志处输出该Object的具体hash_code和serial_number。当程序崩溃,或是内存泄露时,我们仅需将这些信息输出,即可得出有那些Object没有释放。 同时因为记录了创建时的源代码地址,也可以很容易找到创建对象的代码。 使用hash_code/serial_number的另一好处是我们可以完全不传递Object指针,而只传递hash_code/serial_number给其它模块,甚至是保存在服务器或文件中。到时再根据hash_code/serial_number来获取对应的Object。 # Object 是所有对象的基类,它包含了ObjectBaseInfo以及Deinitailize()函数的定义 # 具体Object的定义 DebugObject.h #include using namespace hgl; class DebugObject:public Object { //这里定义了该类的构造与析构函数以及一些其它信息 HGL_OBJECT_CLASS_BODY(DebugObject) public: void Initailize() { //初始化函数,该函数使用模板+Macro定义。函数是可以有参数的,但我们这里没有写。 std::cout<<"DebugObject::Initailize("< //这里定义了缺省的对象管理器来管理DebugObject对象 HGL_DEFINE_DEFAULT_OBJECT_MANAGER(DebugObject); # 使用定义的Object #include int main() { SafePtr obj1=HGL_NEW_OBJECT(DebugObject); //New出新的对象 HGL_DEFINE_OBJECT(DebugObject,obj2); //等于上一行 // DebugObject *obj3=new DebugObject(); //编译不过(构造函数被定义为私有) obj1.Release(); //释放obj1的引用(如引用归0会被delete) //delete obj2; //编译不过,SafePtr<>不能被delete if(obj1.IsValid()) { std::cerr<<"[ERROR] obj1 IsValid() error!"<GetSerialNumber(); SafePtr obj2_indirect=GetObjectBySerial(obj2_sn); //直接根据序列号获取对象 if(!obj2_indirect.IsValid()) { std::cerr<<"[ERROR] obj2_indirect isn't valid!"<