- 浏览: 373480 次
- 性别:
- 来自: 苏州
文章分类
- 全部博客 (335)
- C++ (190)
- 设计模式 (43)
- 数据库技术 (5)
- 网络编程 (11)
- 自动化测试 (6)
- Linux (13)
- OpenSSL (10)
- MS Crypt API (5)
- SCM (2)
- English (4)
- Android (10)
- EMV规范 (1)
- Saturn Platform (0)
- C (10)
- SQL (2)
- ASP.NET (3)
- 英语口语学习 (3)
- 调试工具 (21)
- 编译技术 (5)
- UML (1)
- 项目管理 (5)
- 敏捷开发 (2)
- Http Server (6)
- 代码审查、代码分析 (5)
- 面试基础 (10)
- 重点知识 (16)
- STL (6)
- Efficient C++资料 (8)
- 数据结构和算法 (7)
- 读书笔记 (0)
- 开源项目 (4)
- 多线程 (2)
- Console App (6)
- 个人开源项目 (4)
- IBM DevelopWorks (4)
- Java (16)
- 内存泄漏相关调试和检测 (13)
- 软件测试相关技术 (2)
- C# (11)
- Apple Related (1)
- 软件测试和管理 (2)
- EMV (1)
- Python (1)
- Node.js (6)
- JavaScript (5)
- VUE (1)
- Frontend (1)
- Backend (4)
- RESTful API (3)
- Firebase (3)
最新评论
-
u013189503:
来个密码吧
[C++][Logging] 项目中写日志模块的实现 -
wyf_vc:
来个密码啊!!
[C++][Logging] 项目中写日志模块的实现
#include <iostream> #include <windows.h> using namespace std; #define SAFE_DELETE(p) if (p) { delete p; p = NULL; } class KRefCount { public: KRefCount():m_nCount(0){} public: unsigned AddRef(){ return InterlockedIncrement(&m_nCount); } unsigned Release(){ return InterlockedDecrement(&m_nCount); } void Reset(){ m_nCount = 0; } private: unsigned long m_nCount; }; template <typename T> class SmartPtr { public: SmartPtr(void) : m_pData(NULL) { m_pReference = new KRefCount(); m_pReference->AddRef(); } SmartPtr(T* pValue) : m_pData(pValue) { m_pReference = new KRefCount(); m_pReference->AddRef(); } SmartPtr(const SmartPtr<T>& sp) : m_pData(sp.m_pData) , m_pReference(sp.m_pReference) { m_pReference->AddRef(); } ~SmartPtr(void) { if (m_pReference && m_pReference->Release() == 0) { SAFE_DELETE(m_pData); SAFE_DELETE(m_pReference); } } inline T& operator*() { return *m_pData; } inline T* operator->() { return m_pData; } SmartPtr<T>& operator=(const SmartPtr<T>& sp) { if (this != &sp) { if (m_pReference && m_pReference->Release() == 0) { SAFE_DELETE(m_pData); SAFE_DELETE(m_pReference); } m_pData = sp.m_pData; m_pReference = sp.m_pReference; m_pReference->AddRef(); } return *this; } SmartPtr<T>& operator=(T* pValue) { if (m_pReference && m_pReference->Release() == 0) { SAFE_DELETE(m_pData); SAFE_DELETE(m_pReference); } m_pData = pValue; m_pReference = new KRefCount; m_pReference->AddRef(); return *this; } T* Get() { T* ptr = NULL; ptr = m_pData; return ptr; } void Attach(T* pObject) { if (m_pReference->Release() == 0) { SAFE_DELETE(m_pData); SAFE_DELETE(m_pReference); } m_pData = pObject; m_pReference = new KRefCount; m_pReference->AddRef(); } T* Detach() { T* ptr = NULL; if (m_pData) { ptr = m_pData; m_pData = NULL; m_pReference->Reset(); } return ptr; } private: KRefCount* m_pReference; T* m_pData; }; class CTest { public: CTest(int b) : a(b) {} private: int a; }; int main() { SmartPtr<CTest> pSmartPtr1(new CTest(10)); SmartPtr<CTest> pSmartPtr2(new CTest(20)); pSmartPtr1 = pSmartPtr2; }
发表评论
-
FreeRTOS
2022-03-05 16:31 253Ref https://blog.csdn.net/weix ... -
串口通讯相关
2018-11-02 13:44 417https://bbs.csdn.net/wap/topics ... -
[转]C++验证IP是否可以PING通
2018-10-30 17:54 1346https://www.cnblogs.com/guoyz13 ... -
C++/MFC 換皮膚
2018-10-20 11:05 481https://blog.csdn.net/u01123991 ... -
WinCE 截屏 - C++ 代碼
2018-08-31 09:45 580// this function create a bmp ... -
Android NDK搭建環境
2017-11-27 13:25 593https://www.cnblogs.com/ut2016- ... -
8583协议相关
2017-10-17 13:38 5828583相关资料,整理中... -
Java高级应用之JNI
2017-06-19 09:00 609参考link http://www.cnblogs.com/l ... -
C++实现ping功能
2017-04-18 11:21 2177基础知识 ping的过程是向目的IP发送一个type=8的I ... -
OpenSSL 编译环境搭建
2017-03-27 15:01 9161 安裝VS2008到 c:\Program Files (x ... -
最优非对称加密填充(OAEP)
2017-03-25 14:53 1596OpenSSL命令---rsautl http://blog. ... -
[Platform Builder] 设置SVM OS build Env
2016-11-10 11:39 01 copy one OSDesign Project to ... -
[Windows] System Error Codes(GetLastError )0-----5999
2016-10-26 13:28 1886ERROR_SUCCESS 0 (0x0) T ... -
开源Windows驱动程序框架
2016-09-17 21:35 878转自 http://code.csdn.net/news/28 ... -
c/c++代码中执行cmd命令
2016-09-14 14:50 1926转自 http://blog.csdn.net/slixinx ... -
C#使用C++标准DLL实例(包含callback)
2016-09-11 19:44 1095C++编写标准Win32DLL如下 头文件 /***** ... -
C#调用C++的DLL搜集整理的所有数据类型转换方式
2016-09-09 16:07 974转自 http://www.cnblogs.com/zeroo ... -
WinCE CPU使用率计算 测试工具
2016-09-08 16:14 1006转自 http://blog.csdn.net/jan ... -
switch在C++与C#中的一些差异
2016-09-08 15:19 821参考链接 http://blog.csdn.net/weiwe ... -
C++ 鼠标模拟程序
2016-09-04 12:09 1623转自 http://blog.csdn.net/weixinh ...
相关推荐
在`Source.cpp`中,我们可以编写一些测试代码来验证这个智能指针的正确性,例如创建多个智能指针实例,赋值,解引用等操作,确保内存被正确管理。 通过这种方式,初学者可以理解智能指针的工作原理,并学习如何在...
C++ 智能指针 C++ 智能指针是一种特殊的指针,它可以自动管理动态分配的内存,避免了手动释放内存带来的问题。智能指针的实现是通过模板类 auto_ptr 来实现的。 auto_ptr 类模板的构造函数 ----------------------...
通过实例化CBodyPtr、CPolygonPtr、CCurve2dPtr等typedef声明的智能指针类型,可以方便地对特定类型的对象进行智能指针管理。在实践中,通过几个小例子展示了CReferenced和CRefPtr的基本使用方法,包括普通构造和...
智能指针是C++编程中一个非常重要的概念,它是一种对象,可以自动管理动态分配的内存。在C++中,智能指针通过模仿原始指针的行为,并附加了额外的资源管理功能,避免了手动调用`new`和`delete`可能导致的内存泄漏...
智能指针相信大家听说过吧,我理解的智能指针,既是一个C++模板类,重载了指针操作符(->)和(*)操作符,而使它的实例可以"用指针的形式去调用"。 它可以接管任意类型的指针,所以你只需要放心大胆的new出任意对象...
《C++智能指针——unique_ptr智能指针详解》 智能指针是C++中用于自动管理动态分配内存的一种工具,它可以确保在适当的时候自动释放内存,从而避免内存泄漏的问题。其中,`unique_ptr`是一种特殊的智能指针,它拥有...
2. `std::shared_ptr`:共享所有权的智能指针,可以被多个`std::shared_ptr`实例所持有。当最后一个`std::shared_ptr`销毁时,对象会被自动删除。它通过内部引用计数机制来实现共享。 3. `std::weak_ptr`:弱引用...
在C++编程中,智能指针是一种非常重要的工具,它能自动管理内存,避免内存泄漏。Boost库提供了几种智能指针类型,其中`shared_ptr`和`weak_ptr`是两个关键的成员。在这个名为"Boost智能指针示例源码"的压缩包中,...
智能指针实际上持有句柄类的实例,而不是直接持有原始指针。这样可以实现更复杂的逻辑,例如弱引用、线程安全的引用计数等。 4. C++标准库中的智能指针 C++标准库提供了三种主要的智能指针类型: - `std::unique_...
3. `main.cpp`: 这是程序的主入口点,通常包含测试和使用智能指针的代码,展示了如何创建、赋值和销毁智能指针实例。 4. `String.h`, `RCObject.h`: 这两个是相应的类声明,定义了`String`和`RCObject`类的接口。 ...
一个涉及智能指针,临界区,唯一实例,类模板和线程安全的类的编写例子, 可以直接调用使用。适合c c++ 初学者参考使用
在这个“SharePtr”的实现中,可能包含了自定义的智能指针类,它模仿了`std::shared_ptr`的行为,但可能具有特定的增强功能或适应了代理模式的需求。例如,智能指针可能被用作代理类的一部分,以确保在代理生命周期...
智能指针是C++编程中用于自动管理动态内存的一种机制,尤其在STL(Standard Template Library)和TR1(Technical Report 1)库中扮演着重要角色。它们的主要目标是解决手动内存管理带来的问题,如内存泄漏和重复释放...
4. **析构函数**:当智能指针实例被销毁时,需要检查引用计数并决定是否需要删除实际对象。 5. **操作符`*`和`->`**:为了让自定义智能指针能像普通指针一样使用,需要重载解引用和成员访问操作符。 6. **`get()`...
每个智能指针类内部维护一个计数器,每当有新的智能指针实例指向同一个对象时,计数器加1;相反,当智能指针实例被销毁或赋值给其他智能指针时,计数器减1。当计数器归零时,表明没有智能指针再引用该对象,于是自动...