C++中的指针(三)智能指针.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C++中的指针(三)智能指针 当生成一个C++ object 的时候假如这个class 很大,这个 object 会占用 许多空间。那么每生成一个就占用一片空间,这样会占用许多系统资源。 同时降低效率。一个解决方法就是对用拷贝构造函数生成的 object,让 他不存储数据,而只存储一个指向原来 object 数据的指针。这样空间就 节约了许多。但问题在于这样两个 object 完全联结在了一起。假如修改 了其中一个,另一个也跟着变了。所以这种方法不行取。这里讲的 copy-to-write 技术就是解决这类问题的方法。当通过引用一个已有 object 去拷贝构造新 object 时,新 object 只有一个指向已有 object 的 指针。这两个 object 共享数据。直到其中一个需要修改数据的时候,再 把这两块数据分别。这里举一个最简化的例子。假设一个 class 叫 CLargeObject,里面存有许多数据。我们用一个inner class 来把全部数 据放在一起,叫 CData。CData 里面存有大量数据,例如一个数据库。这 里用最简洁的模型来表示,假设只有一个整数 int m_nVal; CData 里面需 要包含另一个变量。叫作索引数目(reference count)。它记录了指向这 个 CData object 的来自 CLargetObject 类的指针各数。也就是说,总共 有多少 CLargeObject 的 object 正在引用着当前的 CData object。 class CLargeObject { private: struct CData { private: int m_nVal; int m_nReferenceCount; } }; 对于每个 CLargeObject 的object,我们用一个CData 类的指针来指 向其数据。 CData *m_pData; CLargeObject 至少有两个构造函数。第一个是标准的构造函数,初 始化其数据。这时数据是的,所以必需新生成一个 CData 的 object 来存 储数据。 CLargeObject::CLargeObject(int nVal) { m_pData = new Data(nVal); } 而对于 CData 类的构造函数而言,初始化他的 CLargeObject 是第一个指 向他的,这一时刻索引数目m_nReferenceCount 是 1。 CLargeObject::Data::Data(int nVal) : m_nVal(nVal), m_nReferenceCount(1) {} CLargeObject 的其次个构造函数是拷贝构造(copy constructor)。 这样生成的 object 不需要有新的数据,和已有的 object 共享数据就可以 了。这是索引数目需要加 1。表示又有一个 object 指向当前的 CData 了。 CLargeObject::CLargeObject(const CLargeObject m_pData = ob.m_pData; } 这样 CLargeObject 就构造好了,使用了可能的最少的内存。下面看看他 的析够函数(destructor)。当一个object 被 delete 的时候,它的数据不 肯定无效,假如别的 object 还在引用着这个数据,数据需要留下来。固 然,数据的索引数目无论如何都要减 1。 CLargeObject::~CLargeObject() { if (--m_pData-m_nReferenceCount == 0) delete m_pData; } 下面看一看赋值操作。先说用已有的 CLargeObject 赋值给这个 CLargeObject。这时当前 CLargeObject 里面的数据要指向已有的这个 object,就搞定了。 CLargeObject if (--m_pData-m_nReferenceCount == 0) delete m_pData; m_pData = ob.m_pData

文档评论(0)

182****9516 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档