- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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)