随笔 - 13  文章 - 36  trackbacks - 0
<2009年3月>
22232425262728
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿(2)

随笔档案

友情链接

搜索

  •  

最新评论

阅读排行榜

评论排行榜

    这阵子不怎么忙,闲时把Effective c++,more Effective c++, Exceptional c++,more Exceptional c++在复习了下,根据c++ primer 中提到设计一个string 类型需要的功能,编了一个异常安全的string 类。类基于shared_ptr<char>实现,使用的是vc9的shared_ptr(发现vc9的shared_ptr的reset函数可能有问题,看boost的源码,觉得boost的是没有问题的。大家可以试试。),大家也可以使用boost的shared_ptr。一直都是关注大家的文章,今天终于写下了自己的文章了。咱们博客有不少强人,希望大家提点建议。

1,头文件: myString.h

myString.h


2,实现文件:myString.cpp

myString.cpp

 

3,测试代码:

测试代码

 

4,代码打包地址:/Files/Alex-Lee/myString.rar 

posted on 2009-03-18 09:12 Alex-Lee 阅读(1699) 评论(12)  编辑 收藏 引用

FeedBack:
# re: 自己实现的一个基于异常安全的string类 2009-03-18 10:40 wingfire
不得不说,这个实现糟糕的一塌糊涂。逻辑都不正确,谈什么异常安全?  回复  更多评论
  
# re: 自己实现的一个基于异常安全的string类 2009-03-18 10:49 Alex-Lee
@wingfire

兄弟,能说清楚点吗?有好的资料推荐下?  回复  更多评论
  
# re: 自己实现的一个基于异常安全的string类 2009-03-18 12:11 megax
这个实现没有自己的内存管理,根本就无法使用栈上的字符串,shared_ptr的作用,作者还要好好看看。字符串一个很重要的内容就是内存管理,CopyOnWrite之类的技巧是必须的。  回复  更多评论
  
# re: 自己实现的一个基于异常安全的string类 2009-03-18 16:29 yindf
你这个实现太汗了

myString::myString(const char *cstr)
:data_(const_cast<char*>(cstr))
{
}

你这样直接就把外面传来的指针放到shared_ptr,如果我这么么构造:

myString("abc");

那静态的字符串常量难道能被shared_ptr释放掉。。。

BTW: 我只看了前面几行,建议你再仔细看看,而且建议别说异常安全,异常安全好说难做,非常难。  回复  更多评论
  
# re: 自己实现的一个基于异常安全的string类 2009-03-18 20:35 陈梓瀚(vczh)
整个都是错的,应当扔掉重写。你自己也应当好好学习一下什么是C++才行。

1:字符串的char*要自己创建自己删除,别人给你char*你也得复制内容而不是复制指针。
2:shared_ptr<char>不是给你放char数组而是char指针的。
3:equal比较两个指针无意义。
4:速度起见,你应当总是维护一个int length而不是在length()里面strlen,因为length还有很多其他用处。
5:考虑引用计数。
6:功能太少。  回复  更多评论
  
# re: 自己实现的一个基于异常安全的string类 2009-03-18 20:36 陈梓瀚(vczh)
7:没有看到任何跟异常安全有关的东西。  回复  更多评论
  
# re: 自己实现的一个基于异常安全的string类 2009-03-19 10:40 梦在天涯
此地高手多也!

大家的意见还是很好的!  回复  更多评论
  
# re: 自己实现的一个基于异常安全的string类 2009-03-19 12:31 null
@陈梓瀚(vczh)
equal比较两个指针,还是有意义的  回复  更多评论
  
# re: 自己实现的一个基于异常安全的string类 2009-03-19 14:50 Alex-Lee
@yindf
@陈梓瀚(vczh)

首先谢谢大家给的意见,果然高手如云。再次拜服。
两位意见不错,特别是构造函数那个错误比较大。这个确实是疏忽了。Exceptional c++中的NewCopy函数可以借用解决这个问题。

另外,异常安全有三个等级,依次是无资源泄露,状态一致,无异常抛出。一般能实现到状态一致是很不错了。
我谈谈自己设计的初衷。
1,像PIMP/COW实现太过复杂,啰嗦,不太喜欢。
2,使用shared_ptr是因为,智能指针本身就是为了防止原生指针资源泄露问题而设计的,这样就达到了无资源泄露的基本保证。就不需要处理原始指针问题。
因此,我的设计就是保证状态一致问题。也即是说,我设计这个类就是只要保证状态一致即可。如果确实使用char*这样的原生指针作为数据成员,那么这个类确实需要重新设计,这毋庸置疑。

3,equal()函数自己也有些疑惑,到底是只要两个字符串的值相等就行还是需要指向的是同一块字符串内存呢?或者myString对象本身就应该是同一个对象?4,关于维护length长度问题,由于使用shared_ptr实现,因此,就不需要维护 length成员。否则,如果使用shared_ptr与length,还需要维护两者之间的一致。当然,如果使用原生指针char*而不是使用shared_ptr,那么提供length成员变量是应该。
5,由于使用shared_ptr,因此就不需要引用计数了。shared_ptr本身是引用计数的实现。myString封装中没有其他的成员,不涉及占过多内存的问题。


这篇文章的发表,确实是让我学习到了不少东西,再次谢谢大家,希望大家多提意见,这样才能快速成长。
  回复  更多评论
  
# re: 自己实现的一个基于异常安全的string类 2009-03-19 16:06 陈梓瀚(vczh)
@null
设计string的其中一个目的就是将char*封闭起来,获得并操作char*的唯一办法就是使用类似GetBuffer()的东西。因此equal的存在是不合理的。  回复  更多评论
  
# re: 自己实现的一个基于异常安全的string类 2009-03-19 16:08 陈梓瀚(vczh)
@Alex-Lee
1:shared_ptr使用delete而不是delete[]删除你的东西。这是有问题的。所以你必须自己实现。
2:shared_ptr没有copy-on-write,因为这是不可能的,所以你必须自己实现。
3:由于length的重要性,你必须写test case来保证你维护了他们的一致性。  回复  更多评论
  
# re: 自己实现的一个基于异常安全的string类 2009-03-19 16:32 Alex-Lee
@陈梓瀚(vczh)

谢谢。shared_ptr使用delete的话,这样操作数组确实是问题。因此,对于设计数组类型的安全类,不能选用shared_ptr这么处理,这样看来,类设计时选用shared_ptr就是错误的。这样,终于搞明白了,为什么开始有人说这个设计糟糕透顶了。这个设计确实是有问题的。这次,印象深刻,彻底纠正了思想上的错误。
  回复  更多评论
  

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理