免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3145 | 回复: 12
打印 上一主题 下一主题

请教一个STL的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-04-20 14:45 |只看该作者 |倒序浏览
刚刚在测试list,auto_ptr的相关使用方法,但是代码编译通不过!请大家帮忙解决。
代码如下
  1. #include <list>;
  2. #include <vector>;
  3. #include <memory>;
  4. #include <iostream>;

  5. using namespace std;

  6. class test
  7. {
  8. public:
  9.         test( int k = 0 )
  10.         {
  11.                 i = k;
  12.                 cout << "test BBBB - " << i << endl;
  13.         }
  14.         ~test()
  15.         {
  16.                 cout << "test DDDD - " << i << endl;
  17.         }
  18.         test( const test& t )
  19.         {
  20.                 this->;i = t.i;
  21.         }
  22.         const test& operator=( const test& t )
  23.         {
  24.                 this->;i = t.i;
  25.                 return *this;
  26.         }

  27. private:
  28.         int i;
  29. };

  30. typedef auto_ptr<test>; test_ptr;
  31. typedef list<test_ptr>; test_list;

  32. int main()
  33. {
  34.         test_list tl;

  35.         for( int i = 0; i < 10; i++ )
  36.         {
  37.                 test_ptr ptr( new test( i ) );
  38.                 tl.push_back( ptr );
  39.         }
  40. }
复制代码

编译提示
/usr/include/g++-3/stl_construct.h: In function `void construct (_T1 *,
const _T2 & [with _T1 = test_ptr, _T2 = auto_ptr<test>;]':
/usr/include/g++-3/stl_list.h:293:   instantiated from `list<_Tp, _Alloc>;::_M_create_node (const _Tp & [with _Tp = test_ptr, _Alloc = allocator<test_ptr>;]'
/usr/include/g++-3/stl_list.h:344:   instantiated from `list<_Tp, _Alloc>;::insert (_List_iterator<_Tp, _Tp &, _Tp *>;, const _Tp & [with _Tp = test_ptr, _Alloc = allocator<test_ptr>;]'
/usr/include/g++-3/stl_list.h:381:   instantiated from `list<_Tp, _Alloc>;::push_back (const _Tp & [with _Tp = test_ptr, _Alloc = allocator<test_ptr>;]'
a.cpp:44:   instantiated from here
/usr/include/g++-3/stl_construct.h:48: passing `const auto_ptr<test>;'
as `this' argument of `auto_ptr<_Tp>;:perator
auto_ptr<_Tp>;::auto_ptr_ref<_Tp1>; () [with _Tp1 = test, _Tp = test]'
discards qualifiers

论坛徽章:
0
2 [报告]
发表于 2004-04-20 16:25 |只看该作者

请教一个STL的问题

难道不能用auto_ptr对象作为list的元素吗?不可能吧!请用过类似方法的同志帮忙讲解一下如何实现

论坛徽章:
0
3 [报告]
发表于 2004-04-20 17:55 |只看该作者

请教一个STL的问题

在使用 auto_ptr 的时候,有三点要注意的事项:

1. 在函数参数中不要使用引用传递 auto_ptr。因为这样做的结果是不确定的:实参 auto_ptr 可能失去所有权,也可能不失去所有权。

2. 对于 const auto_ptr 或者 const auto_ptr& (引用) 不能再进行所有权的转移。因为所有权丢失相当于改变了原来的 const auto_ptr 对象,这与 const 的定义是矛盾的。

3. auto_ptr 不能作为容器类的元素使用。因为 auto_ptr 不符合对容器类元素的一个最基本的要求:元素的拷贝或者赋值操作不能改变源对象。auto_ptr 做不到这一点。

list 的成员函数 push_back() 的原型定义为:void push_back (const T& x);。
根据规则 1,建议你这个函数的实参不能是 auto_ptr 类型的。但即使是 auto_ptr 类型,也还是合法的。
根据规则 2,你的 ptr 虽然能够传递给虚参 x ,但是,把 x 拷贝给 list 类元素的操作是非法的(会导致编译错误)。因为 x 是 const auto_ptr,违背了规则 2。
根据规则 3,你不能用auto_ptr对象作为list类的元素。

重新规划你的设计吧:用普通指针 list<test*>;(缺点是要手工释放内存)或者直接用 list<test>;。

论坛徽章:
0
4 [报告]
发表于 2004-04-20 18:29 |只看该作者

请教一个STL的问题

刚刚才找了一些资料研究了一下,知道了问题的缘由,回来就看到whyglinux的精彩回帖!真是感谢。不知whyglinux 兄可否留个联系方法(qq or msn or email),今后有什么难解的问题还想多请教 !

论坛徽章:
0
5 [报告]
发表于 2004-04-21 08:54 |只看该作者

请教一个STL的问题

针对上面我们讨论的这个list与auto_ptr的问题!我想再跟大家继续讨论一下,对上面的例子程序而言,test是一个很小的类,实现的拷贝构造函数也就不存在效率问题,但是如果我的应用中实际是一个很大的类,那么频繁的复制操作就效率太低下了,而且对我得应用来说,生成一个test对象然后把它加入list中,然后有list来管理其生命周期是很合理的用法!同时我不想每次都要付出复制对象的代价!如果用list<test*>;的话又失去了对test对象资源管理的自动化。
大家有什么好的解决方案吗?可以在这里讨论讨论啊!同时希望whyglinux兄台继续发表高见

论坛徽章:
0
6 [报告]
发表于 2004-04-21 11:16 |只看该作者

请教一个STL的问题

以 list 类为基类派生一个新的类,在新类的析构函数中处理内存空间的回收问题。

论坛徽章:
0
7 [报告]
发表于 2004-04-21 12:33 |只看该作者

请教一个STL的问题

这个方案我也想到了,并且在一个项目中就是这么做的!但是它还是解决不了智能指针(带引用计数)使用标准模板库的问题,我的想法是在自己实现智能指针时,对于引用计数申明时增加mutable限定符,这样在拷贝时就可以对const SmartPtr&对象改变其引用计数,这样资源管理的自动化和标准模板库的强大特性都可以获得!
不知whyglinux对这个解决方案有何看法?

论坛徽章:
0
8 [报告]
发表于 2004-04-21 12:36 |只看该作者

请教一个STL的问题

其实用whyglinux上面提到的重载list<SmartPtr*>;,在析构函数中对每个SmartPtr*调用delete的方法也可以,但是又增加了一个适配层,大家发表一下意见,到底哪种方案好呢?

论坛徽章:
0
9 [报告]
发表于 2004-04-21 12:39 |只看该作者

请教一个STL的问题

还有用自定义的适配STL的SmartPtr的方案有另一个好处,可以提供==,<运算符的重载以使用map,set等等容器,而用重载list<SmartPtr*>;的方案就不够通用了

论坛徽章:
0
10 [报告]
发表于 2004-04-21 23:46 |只看该作者

请教一个STL的问题

带引用计数的智能指针不是C++标准库中的吧。如果你自己实现,我觉得非常困难。增加引用计数非常容易,但是如何减少计数呢?我觉得这是关键,也是难点,你好好考虑考虑。

还有,要正确区分“重载”和“派生”的概念,你在上面有误用。

我说的是以 list 类为基类派生一个新的类,比如叫 pointer_list,专门用来处理元素是指针的情况,在它的析构函数中释放指针指向对象所占用的存储空间。

从你上面的帖子可以看出,你是想用指向 auto_ptr 的指针作为派生类的元素,完全没有这个必要,用普通的指针即可,如 pointer_list< test* >;,而不是 pointer_list< auto_ptr* >; 或者你的 pointer_list< SmartPtr* >;,这时使用它们没有任何的优越性,只能是一种负担。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP