z****e 发帖数: 2024 | 1 请大侠讲讲,
如果容器里边放指针的话,需要注意什么?
如果不是auto_ptr,就一般指针,有什么需要注意的么?
比如copy什么的,是不是会出现很多share onwership的情况?怎么解决呢? | t****t 发帖数: 6806 | 2 首先容器里不能放auto_ptr. 一定会出问题. STL container对元素的要求是
assignable. 基于这个理由, auto_ptr和valarray都不能作为STL container的元素
其次就是ownership要注意了. 一般指针没有ownership的说法, 但你自己心里要有数,
ownership是不是这个container. 如果是, 那么在erase, pop, pop_back, dtor等地方
要记得delete. 如果不是, 那就所有的地方都没有delete.
放shared_ptr就没有问题了. shared_ptr是assignable的, 所以不用你自己管.
【在 z****e 的大作中提到】 : 请大侠讲讲, : 如果容器里边放指针的话,需要注意什么? : 如果不是auto_ptr,就一般指针,有什么需要注意的么? : 比如copy什么的,是不是会出现很多share onwership的情况?怎么解决呢?
| z****e 发帖数: 2024 | 3 放指针要自己delete了!
这个和容器说不需要delete不是矛盾了?
不过想想也觉得是要自己显式的delete一下才好哈?
另外能不能容器里放引用呢?
,
【在 t****t 的大作中提到】 : 首先容器里不能放auto_ptr. 一定会出问题. STL container对元素的要求是 : assignable. 基于这个理由, auto_ptr和valarray都不能作为STL container的元素 : 其次就是ownership要注意了. 一般指针没有ownership的说法, 但你自己心里要有数, : ownership是不是这个container. 如果是, 那么在erase, pop, pop_back, dtor等地方 : 要记得delete. 如果不是, 那就所有的地方都没有delete. : 放shared_ptr就没有问题了. shared_ptr是assignable的, 所以不用你自己管.
| z****e 发帖数: 2024 | 4 for_each (myvector.begin(), myvector.end(), delete);
那个delete直接作为function object传入? | z****e 发帖数: 2024 | 5 再次阅读,突然发现你这个回复居然没有一句是废话。
,
【在 t****t 的大作中提到】 : 首先容器里不能放auto_ptr. 一定会出问题. STL container对元素的要求是 : assignable. 基于这个理由, auto_ptr和valarray都不能作为STL container的元素 : 其次就是ownership要注意了. 一般指针没有ownership的说法, 但你自己心里要有数, : ownership是不是这个container. 如果是, 那么在erase, pop, pop_back, dtor等地方 : 要记得delete. 如果不是, 那就所有的地方都没有delete. : 放shared_ptr就没有问题了. shared_ptr是assignable的, 所以不用你自己管.
| t****t 发帖数: 6806 | 6 没人说容器不需要delete吧. 容器里如果放的是正常的object, 那跟用auto object一
样, 不需要delete. 如果放的是正常的指针, 那指针需要delete, 容器里的指针也需要
delete.
容器里不能放引用.
【在 z****e 的大作中提到】 : 放指针要自己delete了! : 这个和容器说不需要delete不是矛盾了? : 不过想想也觉得是要自己显式的delete一下才好哈? : 另外能不能容器里放引用呢? : : ,
| t****t 发帖数: 6806 | 7 好象是不行的. 在c++0x的lambda function出来之前, for_each并不是一个很好用的东
西.
【在 z****e 的大作中提到】 : for_each (myvector.begin(), myvector.end(), delete); : 那个delete直接作为function object传入?
| t****t 发帖数: 6806 | 8 不过你可以用std::tr1::reference_wrapper来包装一个引用, make it assignable
and copyconstructable.
【在 t****t 的大作中提到】 : 没人说容器不需要delete吧. 容器里如果放的是正常的object, 那跟用auto object一 : 样, 不需要delete. 如果放的是正常的指针, 那指针需要delete, 容器里的指针也需要 : delete. : 容器里不能放引用.
| z****e 发帖数: 2024 | 9 回去学习。
这个要看。
【在 t****t 的大作中提到】 : 不过你可以用std::tr1::reference_wrapper来包装一个引用, make it assignable : and copyconstructable.
| O*******d 发帖数: 20343 | 10 容器不能放reference,因为reference需要在产生时就initialize。例如,
vectora(5) 无法生成。 同样的道理还有 new int &[5];
【在 z****e 的大作中提到】 : 放指针要自己delete了! : 这个和容器说不需要delete不是矛盾了? : 不过想想也觉得是要自己显式的delete一下才好哈? : 另外能不能容器里放引用呢? : : ,
| | | z****e 发帖数: 2024 | 11 恩,看来常量reference都不可以呀,因为连个能attach的临时变量都没有。
【在 O*******d 的大作中提到】 : 容器不能放reference,因为reference需要在产生时就initialize。例如, : vectora(5) 无法生成。 同样的道理还有 new int &[5];
| d****p 发帖数: 685 | 12 You cannot use std::vector. But you can use std::vector
reference_wrapper >.
So
int i = 9;
int& j = i;
std::vector > myvec;
myvec.push_back(boost::reference_wrapper(i);
myvec.push_back(boost::reference_wrapper(j);
++i;
// now both elements in vector become 10.
Basically it is a wrapper of a pointer which always points to an initialized
variable (not out of scope).
【在 z****e 的大作中提到】 : 恩,看来常量reference都不可以呀,因为连个能attach的临时变量都没有。
| d****p 发帖数: 685 | 13 I think it is Ok, although not as handy as BOOST_FOREACH, which really
achieves the level of expressiveness
as Python and Perl.
The only inconvenience for using std::for_each is you have to explicitly
define your functor - for really simple
tasks it looks an overkill compared with a hand written loop. I however
really hate for-iterator stuff - in a
team environment other people may get lazy and modify the loop in a way that
readability will be harmed.
So, using high level construct like for_each
【在 t****t 的大作中提到】 : 好象是不行的. 在c++0x的lambda function出来之前, for_each并不是一个很好用的东 : 西.
| h*****0 发帖数: 4889 | 14 这东西跟指针有啥区别?
【在 t****t 的大作中提到】 : 不过你可以用std::tr1::reference_wrapper来包装一个引用, make it assignable : and copyconstructable.
| X****r 发帖数: 3557 | 15 不能赋NULL,不能(直接)进行算术运算。
【在 h*****0 的大作中提到】 : 这东西跟指针有啥区别?
| l******e 发帖数: 12192 | 16 这种情况,还是用boost的ptr_container好
,
【在 t****t 的大作中提到】 : 首先容器里不能放auto_ptr. 一定会出问题. STL container对元素的要求是 : assignable. 基于这个理由, auto_ptr和valarray都不能作为STL container的元素 : 其次就是ownership要注意了. 一般指针没有ownership的说法, 但你自己心里要有数, : ownership是不是这个container. 如果是, 那么在erase, pop, pop_back, dtor等地方 : 要记得delete. 如果不是, 那就所有的地方都没有delete. : 放shared_ptr就没有问题了. shared_ptr是assignable的, 所以不用你自己管.
|
|