http://myajax95./
关于这个smart pointer这个东西就爽罗,那个添加引用计数我模拟过一次,就是对 CSTRING s1("abcd"); CSTRING s2("abcd")这样重复的字符串添加引用计数,防止内容重复,节省资源.我知道auto_ptr<XXX>这个智能指针又有引用计数的,还有好像这个东西不能用在STL中的,因为如果用在STL中,它会专业引用的所有权.. 请 myajax95讲这全个帖子放回C++论坛,我想听下你关于引用计数的高见,我还不是太熟悉这个强大的技术,我只看过more effective c++讨论过这个话题,都忘记得差不多了
我刚刚自己写了个引用计数的,不过效率很低的
#include<iostream>
#include<list>
using namespace std;
class String{
public:
String(const char *initValue="");
String(const String& rhs);
~String();
void display();
private:
struct StringValue{
int refCount;
char *data;
StringValue(const char *initValue);
~StringValue();
static list<StringValue*> sValuelist;
};
StringValue *value;
};
list<String::StringValue*> String::StringValue::sValuelist;
String::StringValue::StringValue(const char* initValue)
{
list<StringValue*>::iterator it = sValuelist.begin();
bool flag = false;
for(; it != sValuelist.end(); it++)
{
if(strcmp((*it)->data, initValue) == 0)
{
flag = true;
break;
}
}
if( flag == false)
{
data = new char[strlen(initValue) + 1];
strcpy(data, initValue);
refCount = 1;
sValuelist.push_back(this);
}
}
String::StringValue::~StringValue()
{
delete data;
}
String::String(const char *initValue)
{
list<StringValue*>::iterator it = StringValue::sValuelist.begin();
bool flag = false;
for(; it != StringValue::sValuelist.end(); it++)
{
if(strcmp((*it)->data, initValue) == 0)
{
value = (*it);
++value->refCount;
flag = true;
break;
}
}
if( flag == false)
{
value = new StringValue(initValue);
}
}
String::String(const String& rhs)
:value(rhs.value)
{
++value->refCount;
}
String::~String()
{
if(--value->refCount == 0)
delete value;
}
void String::display()
{
cout<<value->data <<endl;
cout<<"reference"<<endl;
cout<<value->refCount<<endl;
}
void main()
{
String s1("More Effective c++");
s1.display();
String s2("More Effective c++");
s2.display();
String s3(s1);
s3.display();
}
[此贴子已经被作者于2006-7-24 15:31:39编辑过]