C++ 智能指针

C++ 智能指针

 

 

最近在做Windows上管理USB手机终端的相关程序。

 

实际情况:

Class Phone *symbian = new Phone();

Class ConnectManager, Class CommManager都需要对symbian指针进行引用和维护(保留一个拷贝)。

但是这样就导致了symbian何时可以被delete?

在ConnectManager析构函数中delete? 这将导致CommManager无法使用symbian了。

在CommManager中delete symbian也是同样的道理。

 

在参考了《C++ Primer》之后,自己动手写一个智能指针

 

代码如下

 

 

#include <iostream>
using namespace std;
class ConnectManager;
class CommManager;
class Phone
{
public:
Phone() { cout << "Hello World!" << endl; }
~Phone() { cout << "Bye!" << endl; }
};
class U_ptr
{
friend class ConnectManager;
friend class CommManager;

public:
U_ptr(Phone *pH): use(0), pPhone(pH) { }
~U_ptr() { delete pPhone; }
private:
Phone *pPhone;//这里是关键,转移数据的宿主
size_t use;
};
class ConnectManager
{
public:
ConnectManager(U_ptr *p): pUptr(p)
{
++pUptr->use;
cout << "ConnectManager: Hi I get the Phone" << endl;
cout << pUptr->use << " users" << endl;
}
~ConnectManager()
{
cout << "ConnectManaer: Can I delete the Phone?" << endl;
if (--pUptr->use == 0)
{
cout << "Yes, You can" << endl;
delete pUptr;
}
else
{
cout << "No, You can't, The Phone is in use" << endl;
cout << pUptr->use << " users" << endl;
}
}
private:
U_ptr *pUptr;
};
class CommManager
{
public:
CommManager(U_ptr *p): pUptr(p)
{
++pUptr->use;
cout << "CommManager: Hi I get the Phone" << endl;
cout << pUptr->use << " users" << endl;
}
~CommManager()
{
cout << "CommManager: Can I delete the Phone" << endl;
if (--pUptr->use == 0)
{
cout << "Yes, You can" << endl;
}
else
{
cout << "No, You can't. The Phone is in use" << endl;
cout << pUptr->use << " users" << endl;
}
}
private:
U_ptr *pUptr;
};
int main(void)
{
Phone *symbian = new Phone();
U_ptr *pU = new U_ptr(symbian);
ConnectManager connManager = ConnectManager(pU);
CommManager commManager = CommManager(pU);

 

 

 

运行结果如下:

 

Hello World!

ConnectManager: Hi I get the Phone

1 users

CommManager: Hi I get the Phone

2 users

CommManager: Can I delete the Phone?

No, You Can't. The Phone is in use;

1 users

ConnectManager: Can I delete the Phone?

Yes. You can

Bye!

 

 

代码中已经注释出来了。智能指针的关键是转交数据的宿主。虽然Phone是给CommManager和ConnectManager使用,

但是,真正的Phone要由智能指针类去维护。

 

 

 

时间: 2025-01-05 17:45:54

C++ 智能指针的相关文章

C++中智能指针(smarter pointer)自定义删除器(deleter) 的方法

智能指针包含两种"shared_ptr"和"unique_ptr", 由于两种指针的实现方式不同, 所以传递删除器的方式也不同; "shared_ptr"的传递删除器(deleter)方式比较简单, 只需要在参数中添加具体的删除器函数名, 即可; 注意是单参数函数; "unique_ptr"的删除器是函数模板(function template), 所以需要在模板类型传递删除器的类型(即函数指针(function pointe

C++引用计数的智能指针有效回收方法

引用计数指针是否能有效地回收,对系统意外关机之后数据的恢复来说至关重要,关键是要避免对象复制. 怎样从灾难性故障中,恢复一个长期运行.系统级的后台守护进程或者服务,在如今的软件设计过程中,已成为了一个重要的考虑因素.当这些软件是由C++语言编成,并使用了引用计数的智能指针时,那么,智能指针的有效回收,对系统是否具有可伸缩级的恢复能力.甚至正确地继续未完成的操作来说,都显得至关重要. 在本文中,描述了一种方法,可从关机之后的软件恢复中,有效地回收引用计数指针,而且此方法在内存占用方面也非常高效,这

在Word 2007中使用智能指针功能

智能指针是Word中的一项编程功能,用户可以在Word2007中启用或取消智能指针功能,操作步骤如下所述: 第1步, 打开Word2007文档窗口,依次单击"Office按钮"→"Word选项"按钮,如图2012040307所示. 图2012040307 单击 "Word选项"按钮 第2步,打开"Word选项"对话框,切换到"高级"选项卡.在"编辑选项"区域选中或取消"使用智

Google C++编程风格指南(四):智能指针和其他C++特性

1.对于智能指针,安全第一.方便第二,尽可能局部化(scoped_ptr): 2.引用形参加上const,否则使用指针形参:3.函数重载的使用要清晰.易读:4.鉴于容易误用,禁止使用缺省函数参数(值得商榷):5.禁止使用变长数组:6.合理使用友元-- Google特有的风情 Google有很多自己实现的使C++代码更加健壮的技巧.功能,以及有异于别处的C++的使用方式. 1.智能指针(Smart Pointers) 如果确实需要使用智能指针的话,scoped_ptr完全可以胜任.在非常特殊的情况

Word 2010中智能指针功能的使用方法

智能指针是Word中的一项编程功能,用户可以在Word 2010中启用或取消智能 指针功能,操作步骤如下: 第1步,打开Word 2010文档窗口,依次单击"文件 "→"选项"命令,如图2011122801所示. 图 2011122801 选择"选项"命令 第2步,打开"Word选项"对话框,切换到"高级"选 项卡.在"编辑选项"区域选中或取消"使用智能指针" 复选框

More Effective C++之智能指针

智能指针具有非常强大的能力,谨慎而明智的选择能带来极大的好处.我不否认智能指针的能力,虽然我在之前的否认过auto_ptr.可能由于我自身能力的限制,体会不到auto_ptr的好处,但这样的可能性我觉得已经不大了.但auto_ptr是最简单的智能指针,在它的周围存在大量的作品,这些作品包括Boost.Loki.ACE等等,但是可惜的是目前没有一个我能够说我很熟悉,那么本篇只是作为一个入门,在此基础上,应当阅读Boost.Loki.ACE相关源码. Smart Pointer的核心是实现 temp

在VC中使用智能指针操作Excel

最近的一个工程中,需要将数据导入Excel表格中,项目经理知道我以前没有接触过操作Excel的经验,于是给了一段小程序给我,让我参考着做. 这段程序是使用智能指针操作Excel,在网络上找了一个星期,居然没有一片关于智能指针操作Excel的文章,只有Automation技术,而且所有介绍Automation技术的文章都是大同小异,并且代码多,说明少.没有任何帮助,光有一堆代码,对于理解和使用没有太大的帮助.在这样一个艰苦的条件下,我决定利用手中仅有的工具:Microsoft Excel Visu

C++ 智能指针深入解析

以下是对C++中智能指针的使用进行了详细的分析介绍,需要的朋友可以参考下   1. 为什么需要智能指针?简单的说,智能指针是为了实现类似于Java中的垃圾回收机制.Java的 垃圾回收机制使程序员从繁杂的内存管理任务中彻底的解脱出来,在申请使用一块内存区域之后,无需去关注应该何时何地释放内存,Java将会自动帮助回收. 但是出于效率和其他原因(可能C++设计者不屑于这种傻瓜氏的编程方式),C++本身并没有这样的功能,其繁杂且易出错的内存管理也一直为广大程序员所诟 病. 更进一步地说,智能指针的出

C++裸指针和智能指针的效率对比

  1.unique_ptr与queue连用,unique_ptr的使用特点:不能使用拷贝构造函数,拷贝赋值函数,但是可以使用move构造函数和move赋值函数. 2.std::move的使用,可以将左值表达式强制转化成为右值表达式 3. 重载new操作符调试内存使用情况,因为心里不是很放心(智能指针真的为我释放了内存么?)所以尝试了重写new delete操作符. 4. 得到的结果是raw_ptr:unique_ptr:shared_ptr的性能是5:7:11,可见智能指针的效率还是相当诱人.

Word2013中怎样使用智能指针

  第1步,打开Word2013文档窗口,依次单击"文件"→"选项"命令,如图2013042403所示. 2第2步,打开"Word选项"对话框,切换到"高级"选项卡.在"编辑选项"区域选中或取消"使用智能指针"复选框,并单击"确定"按钮,如图2013042404所示.