z****e 发帖数: 2024 | 1 简短节说:
auto_ptr > p=(new vector);
//...something
transform( p->begin(),p->end(),p->begin(),
bind2nd(multiplies(), 10.0) );
//此处看看p.
问题1:发现p并没有失去 ownership,但是还是心虚,需要大牛confirm。
我知道auto_ptr不能作为容器元素,
问题2:但是auto_ptr作为函数参数的时候,往往会失去ownership是吗?
问题3:使用generic algorithm,什么时候auto_ptr会失去ownership 呢?
问题4:那么使用generic algorithm,auto_ptr结合, 例如上面的东东,需要注意什么
呢? |
z****e 发帖数: 2024 | 2 另外一个小问,
如果自己定义的function object超过3个参数的,bind2nd就没法用了,我就用一个
pair把后面两个绑起来,变成2个参数的function object,继续用bind2nd adaptor.
有没有好一点的,或者通用一点的方法呢? |
z****e 发帖数: 2024 | 3 还有一个问题,
一般auto_ptr用的多不多?是不是要像书上说的,养成用它代替指针的习惯?只要速度
允许。 |
p***o 发帖数: 1252 | 4
1 自己写个functor
2 用boost::bind
3 等C++0x
4 还是用for循环吧
【在 z****e 的大作中提到】 : 另外一个小问, : 如果自己定义的function object超过3个参数的,bind2nd就没法用了,我就用一个 : pair把后面两个绑起来,变成2个参数的function object,继续用bind2nd adaptor. : 有没有好一点的,或者通用一点的方法呢?
|
p***o 发帖数: 1252 | 5
什么书这么说?它是说"智能指针"把。
智能指针有很多种,auto_ptr一般用来在同一个函数中自动释放new的东西,传来传去
还是shared_ptr比较保险。
【在 z****e 的大作中提到】 : 还有一个问题, : 一般auto_ptr用的多不多?是不是要像书上说的,养成用它代替指针的习惯?只要速度 : 允许。
|
z****e 发帖数: 2024 | 6 shared_ptr是不是boost里边的?
oh,上帝呀! 我还要去安装boost!这STL还没整明白呢。
一般类的data member是不是设计成auto_ptr比较好?
【在 p***o 的大作中提到】 : : 什么书这么说?它是说"智能指针"把。 : 智能指针有很多种,auto_ptr一般用来在同一个函数中自动释放new的东西,传来传去 : 还是shared_ptr比较保险。
|
p***o 发帖数: 1252 | 7
那你可以先不用整智能指针,先把STL里的container/algorithm搞明白。
智能指针是用来包装new出来的东西的。
一般类的data member你都用new的吗?看起来不大对 ...
基本上你把container都搞明白就没有什么地方需要new了。
【在 z****e 的大作中提到】 : shared_ptr是不是boost里边的? : oh,上帝呀! 我还要去安装boost!这STL还没整明白呢。 : 一般类的data member是不是设计成auto_ptr比较好?
|
z****e 发帖数: 2024 | 8 哦,我这个职能指针就是指向一个vector,而且该指针是一个私有data member。
您说这样设计行不行呢。
多谢了。
【在 p***o 的大作中提到】 : : 那你可以先不用整智能指针,先把STL里的container/algorithm搞明白。 : 智能指针是用来包装new出来的东西的。 : 一般类的data member你都用new的吗?看起来不大对 ... : 基本上你把container都搞明白就没有什么地方需要new了。
|
p***o 发帖数: 1252 | 9 你为什么要用一个指针指向一个vector?
class A
{
std::vector dbl_vec_;
public:
...
};
这样不好吗?你原来是不是学过java,每个类都要new出来?C++里不是
这么用的。
用STL基本上没有必要用new/malloc,等你非用不可的时候,你就明白
智能指针是啥了 ...
【在 z****e 的大作中提到】 : 哦,我这个职能指针就是指向一个vector,而且该指针是一个私有data member。 : 您说这样设计行不行呢。 : 多谢了。
|
z****e 发帖数: 2024 | 10 是啊,你这么一说,我也觉得没必要哈?
如果传这个vector,就用引用,效率和指针是一样的吧?
【在 p***o 的大作中提到】 : 你为什么要用一个指针指向一个vector? : class A : { : std::vector dbl_vec_; : public: : ... : }; : 这样不好吗?你原来是不是学过java,每个类都要new出来?C++里不是 : 这么用的。 : 用STL基本上没有必要用new/malloc,等你非用不可的时候,你就明白
|
|
|
p***o 发帖数: 1252 | 11
嗯,一样
【在 z****e 的大作中提到】 : 是啊,你这么一说,我也觉得没必要哈? : 如果传这个vector,就用引用,效率和指针是一样的吧?
|
O*******d 发帖数: 20343 | 12 我用auto_ptr很多。 但要注意一些细节。
1。auto_ptr一般不要用来做函数参数。 因为ownershi会转移到函数里面去。函数一旦
完成,内存释放,外面的auto_ptr
就成了悬浮的指针了。
2。函数可以return一个auto_ptr。 这种用法比较安全。 一般原则是,从较小的scope
往较大的scope传递,而不是相
反。 所以在函数内部使用时,不要把auto_ptr传到code block里去,但可以反向传递。
3。如果在函数里需要allocate内存,用auto_ptr比较好,一来不会忘记delete,二来
是exception safe。
【在 z****e 的大作中提到】 : 还有一个问题, : 一般auto_ptr用的多不多?是不是要像书上说的,养成用它代替指针的习惯?只要速度 : 允许。
|
O*******d 发帖数: 20343 | 13 vector在引用时效率和指针是不一样的。 vector要把全体数据copy一遍。
【在 z****e 的大作中提到】 : 是啊,你这么一说,我也觉得没必要哈? : 如果传这个vector,就用引用,效率和指针是一样的吧?
|
p***o 发帖数: 1252 | 14 啥?
【在 O*******d 的大作中提到】 : vector在引用时效率和指针是不一样的。 vector要把全体数据copy一遍。
|
z****e 发帖数: 2024 | 15 mark!
scope
递。
【在 O*******d 的大作中提到】 : 我用auto_ptr很多。 但要注意一些细节。 : 1。auto_ptr一般不要用来做函数参数。 因为ownershi会转移到函数里面去。函数一旦 : 完成,内存释放,外面的auto_ptr : 就成了悬浮的指针了。 : 2。函数可以return一个auto_ptr。 这种用法比较安全。 一般原则是,从较小的scope : 往较大的scope传递,而不是相 : 反。 所以在函数内部使用时,不要把auto_ptr传到code block里去,但可以反向传递。 : 3。如果在函数里需要allocate内存,用auto_ptr比较好,一来不会忘记delete,二来 : 是exception safe。
|
z****e 发帖数: 2024 | 16 同,啥?
【在 O*******d 的大作中提到】 : vector在引用时效率和指针是不一样的。 vector要把全体数据copy一遍。
|
t****t 发帖数: 6806 | 17 他应该是没看清楚你问什么.
【在 z****e 的大作中提到】 : 同,啥?
|
v*s 发帖数: 946 | 18 "你原来是不是学过java,每个类都要new出来?"
让俺笑出声了。 哈哈。
+里不是
【在 p***o 的大作中提到】 : 你为什么要用一个指针指向一个vector? : class A : { : std::vector dbl_vec_; : public: : ... : }; : 这样不好吗?你原来是不是学过java,每个类都要new出来?C++里不是 : 这么用的。 : 用STL基本上没有必要用new/malloc,等你非用不可的时候,你就明白
|
O*******d 发帖数: 20343 | 19 vector a;
vector b;
.
.
.
a = b; 这一步把b里边的全部数据copy到a里面了。 a和b没有任何数据共享。
【在 p***o 的大作中提到】 : 啥?
|
O*******d 发帖数: 20343 | 20 如果需要把auto_ptr的指针当成函数参数,可以直接使用raw pointer,就是用get()。
这是比较安全的用法。
func(int * pInt)
{
.
.
}
auto_ptr a(new int());
func(a.get()); |
|
|
t****t 发帖数: 6806 | 21 that's not called a 引用.
引用 is reference.
【在 O*******d 的大作中提到】 : vector a; : vector b; : . : . : . : a = b; 这一步把b里边的全部数据copy到a里面了。 a和b没有任何数据共享。
|
z****e 发帖数: 2024 | 22 你是说,只要func里边,不delete,auto_ptr a 在外边仍然有ownership 对吧?因为
不是,release()。
如果func里边delete pInt 了,咋整?外边的 a 咋办?
【在 O*******d 的大作中提到】 : 如果需要把auto_ptr的指针当成函数参数,可以直接使用raw pointer,就是用get()。 : 这是比较安全的用法。 : func(int * pInt) : { : . : . : } : auto_ptr a(new int()); : func(a.get());
|
z****e 发帖数: 2024 | 23 他说的应该是赋值吧。
【在 t****t 的大作中提到】 : that's not called a 引用. : 引用 is reference.
|
t****t 发帖数: 6806 | 24 赋值也是引用和指针一样.
【在 z****e 的大作中提到】 : 他说的应该是赋值吧。
|
p***o 发帖数: 1252 | 25
那说明这个func的设计有问题。除非这个func功能就是释放pInt,要不然
绝对不要在里面delete pInt。
【在 z****e 的大作中提到】 : 你是说,只要func里边,不delete,auto_ptr a 在外边仍然有ownership 对吧?因为 : 不是,release()。 : 如果func里边delete pInt 了,咋整?外边的 a 咋办?
|
O*******d 发帖数: 20343 | 26 auto_ptr在函数外面,没有传递进去,用get()还保持有ownership。 如果你
要在函数里边delete那个指针,谁也救不了你。
【在 z****e 的大作中提到】 : 你是说,只要func里边,不delete,auto_ptr a 在外边仍然有ownership 对吧?因为 : 不是,release()。 : 如果func里边delete pInt 了,咋整?外边的 a 咋办?
|