Ptr:ns-3的智能指针
Ptr的实现分为两个部分:
- Ptr类:负责保存原始指针和模拟原始指针操作(复制、赋值等);
- SimpleRefCount类:负责记录所有指向所分配的对象内存的指针数量。
简化两个类的定义,可以分别视为
| template<typename T> |
| class Ptr{ |
| private: |
| T *m_ptr; |
| }; |
| |
| template<typename T, typename PARENT = empty, typename DELETER = DefaultDeleter<T>> |
| class SimpleRefCount : public PARENT{ |
| public: |
| inline void Ref(void) const{ |
| m_count++; |
| } |
| inline void Unref(void) const{ |
| m_count--; |
| if(m_count==0){ |
| DELETER::Delete(...); |
| } |
| } |
| private: |
| mutable uint32_t m_count; |
| }; |
完整的实现中,Ptr类还有一系列成员函数和重载运算符来模拟指针操作,这些操作会调用对象的Ref和Unref来管理计数。容易想到,这样做的前提是Ptr的模板里的类一定是SimpleRefCount的派生类。
Ptr有以下常用函数:
- 创建对象
| Packet *p = new Packet(100); |
| Ptr<Packet> ptr = Create<Packet>(100); |
- 赋值操作
| Packet *p = new Packet(); |
| Ptr<Packet> ptr = p; |
- 比较运算
| if(ptr == p){} |
| if(ptr1 != ptr2){} |
- 流
| std::cout << "address: " << ptr << std::end; |
- 浅拷贝
- 深拷贝
| Ptr<Packet> ptr2 = Copy(ptr1); |
- 类型转换
ns-3封装了C++标准库的类型转换函数DynamicCast、StaticCast、ConstCast
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本