| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 8429 人关注过本帖
标题:[求助]2重指针的问题-->myajax95转移-->baidu转移
只看楼主 加入收藏
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
得分:0 
C++有比简单指针复杂无数倍的会自己add reference, delete reference,重载操作符"->"的指针叫smart pointer,可惜不是这帖子讨论的,我就不饶舌了。

http://myajax95./
2006-07-24 14:25
nick_annie
Rank: 1
等 级:新手上路
帖 子:105
专家分:0
注 册:2005-11-19
收藏
得分:0 
晕了....这帖子怎么跑这来了?

2006-07-24 14:44
热情依然
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:22
帖 子:715
专家分:0
注 册:2005-4-5
收藏
得分:0 
以下是引用myajax95在2006-7-24 14:25:55的发言:
C++有比简单指针复杂无数倍的会自己add reference, delete reference,重载操作符"->"的指针叫smart pointer,可惜不是这帖子讨论的,我就不饶舌了。

关于这个smart pointer这个东西就爽罗,那个添加引用计数我模拟过一次,就是对 CSTRING s1("abcd"); CSTRING s2("abcd")这样重复的字符串添加引用计数,防止内容重复,节省资源.我知道auto_ptr<XXX>这个智能指针又有引用计数的,还有好像这个东西不能用在STL中的,因为如果用在STL中,它会专业引用的所有权.. 请 myajax95讲这全个帖子放回C++论坛,我想听下你关于引用计数的高见,我还不是太熟悉这个强大的技术,我只看过more effective c++讨论过这个话题,都忘记得差不多了


c++/C + 汇编 = 天下无敌
2006-07-24 14:55
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
得分:0 
我这里晚上12:24了,回头我单开个帖子吧。

http://myajax95./
2006-07-24 15:25
热情依然
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:22
帖 子:715
专家分:0
注 册:2005-4-5
收藏
得分:0 

我刚刚自己写了个引用计数的,不过效率很低的

#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编辑过]


c++/C + 汇编 = 天下无敌
2006-07-24 15:28
穆扬
Rank: 1
等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-07-24 15:35
穆扬
Rank: 1
等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-07-24 15:36
热情依然
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:22
帖 子:715
专家分:0
注 册:2005-4-5
收藏
得分:0 
以下是引用myajax95在2006-7-24 15:25:04的发言:
我这里晚上12:24了,回头我单开个帖子吧。

好,期待您的文章,正好学一下


c++/C + 汇编 = 天下无敌
2006-07-24 15:38
穆扬
Rank: 1
等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-07-24 15:42
热情依然
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:22
帖 子:715
专家分:0
注 册:2005-4-5
收藏
得分:0 
以下是引用穆扬在2006-7-24 15:35:39的发言:

我经常搞不清的是
许多c++论坛的网友尤其是斑竹们是不屑于懂还是装着不屑于懂还是根本不懂你所谓的c的简单指针

你可能还不明白,C++已经尽量减少复杂指针的操作了,尤其是数组的指针,老实说,关于int(*p)[5]这样的指针你不说我还忘记了.所以对于多重指针,运用可能没有你们C的熟练,所以我们都是将心思放在解决内存泄漏的方面上.就像上面说的智能指针,根本上就是一个解决内存泄漏,节省内存的好方法. 所以穆兄不要太执着了,有些C的技巧在C++里面是多余的


c++/C + 汇编 = 天下无敌
2006-07-24 15:44
快速回复:[求助]2重指针的问题-->myajax95转移-->baidu转移
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.089540 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved