woaidongmao

文章均收录自他人博客,但不喜标题前加-[转贴],因其丑陋,见谅!~
随笔 - 1469, 文章 - 0, 评论 - 661, 引用 - 0
数据加载中……

使用std::vector 的陷阱

在使用std的容器的时候,不少人喜欢用vector, 因为比起list,更省空间,而且可以根据index直接读取某个值,而不用一个个枚举来取.

但是,std::vector确实有一些值得注意的陷阱, 这里先说其中一个, 请看以下代码.

std::vector< int >  values;

values.push_back(1);

values.push_back(2);

values.push_back(3);

values.erase(values.begin() + 1);

乍看之下,这几行简单的代码没什么 问题. 实际执行起来, 还是没什么问题 , 但却有一个陷阱. 由于例子里面用的是intvector,所以这样做没有任何问题, ,假如不是一个int, 而是一个类,一个结构体,类或结构体里面还有指针, 那就很可能出问题了. why?

因为vector不象list,vector始终要保持一个完整的内存结构(因为就是一个数组),这样才可以让values[1]这样的方式正确运行. 但是,如果要在vector中间删掉一个成员的话,vector是这样做的, 先把该成员后面的一个成员,一直到最后一个成员往前一位置拷贝,这样需要删除的成员已经被后面的覆盖了, 然后再删除最后一个成员,这样,vector又能保持一段完整的内存结构了注意,因为最后一个成员会被删除,而如果这个成员里面有一个成员变量是指针, 那析构函数很有可能会把这个指针指向的地方释放掉这样,即使最后一个成员被复制了一份 到倒数第2的位置,也因为在他本身被删除的时候,把倒数第2(也就是它的复制) 的指针成员所指向的地方给释放了! 如图:

                      clip_image002

解决的办法也很简单, 最少有2. 1,  增加作为vector类型的类的拷贝构造函数, 因为vectorerase的时候会发生一次拷贝,让拷贝构造函数不单单是复制指针,还把指针所指向的内容给拷贝一份,这样就不会导致被最后一个成员释放的时候一起释放掉了. 2, 如果有引用记数的话,如智能指针, 就不会被释放掉了。不过如果一般编码里面不需要用到引用记数的话,还是方法1比较简便

 

posted on 2009-09-02 22:36 肥仔 阅读(5868) 评论(30)  编辑 收藏 引用 所属分类: Boost & STL

评论

# re: 使用std::vector 的陷阱  回复  更多评论   

不明白为什么成员变量是指针就把指针所指的地方析构,是你的类实现的问题吗?

int *p1 = new int(1);
int *p2 = p1;

vector< int* > ivec;
ivec.push_back(p1);
ivec.push_back(p2);

当我把vector中的p2 erase掉之后,p1所指无物?
2009-09-03 09:20 | nelson

# re: 使用std::vector 的陷阱[未登录]  回复  更多评论   

其实我觉得这不是vector给你设的“陷阱”,STL容器只有责任维护你给他的东西,但没理由维护这个东西里面的东西。不仅仅是vector,STL所有的容器如果按你这种思维去用,都会出问题:
class Test
{
int *a;
~Test()
{
delete a;
}
};
std::vector<Test> 维护Test::a其实应该是你的责任。
2009-09-03 13:37 | Kevin Lynx

# re: 使用std::vector 的陷阱  回复  更多评论   

所有容器里面都应该只存储简单数据结构,一旦数据结构为复杂数据结构时,则应该存储该数据的指针。
2009-09-15 16:55 | davidfan

# re: 使用std::vector 的陷阱  回复  更多评论   

Last time I downloaded the mp ringtones with the help of the <a href="http://www.milliontones.com">ringtones</a> site and used to be completely satisfied.
2010-06-24 17:54 | ConnerThelma30

# re: 使用std::vector 的陷阱  回复  更多评论   

I think that you really know how not easy could the custom term paper creating be. But, you shouldn’t be confused, simply because the term paper writing services present the do my essay papers and there’s no problem to buy custom writing services and be satisfied.
2010-09-28 17:58 | buy essays cheap

# re: 使用std::vector 的陷阱  回复  更多评论   

Frequently, that is better to buy essays, particularly if you do not have an opportunity to compose even an easy academic task.
2010-12-10 20:13 | custom essays

# re: 使用std::vector 的陷阱  回复  更多评论   

Excellent post. I was checking continuously this blog and I'm impressed! Very useful information specifically the last part :) I care for such info a lot. I was looking for this certain information for a very long time. Thank you and good luck.
2013-10-03 07:48 | have a peek here

# re: 使用std::vector 的陷阱  回复  更多评论   

I do not even understand how I stopped up here, but I assumed this publish used to be good. I don't realize who you might be but certainly you're going to a well-known blogger if you aren't already ;) Cheers!
2013-10-22 17:32 | agen bola

# re: 使用std::vector 的陷阱  回复  更多评论   

I like the valuable info you provide in your articles. I'll bookmark your weblog and check again here frequently. I'm quite certain I'll learn a lot of new stuff right here! Best of luck for the next!
2013-11-08 10:14 | Navigate Here

# re: 使用std::vector 的陷阱  回复  更多评论   

但没理由维护这个东西里面的东西。不仅仅是vector,所有的容器如果按你这种思维去用,都会出问题 为复杂数据结构时,则应该存储该数据
2014-09-10 21:40 | Agen Tangkas

# re: 使用std::vector 的陷阱  回复  更多评论   

果按你这种思维去用,都会出问题 为复杂数据结构时,则应该

http://uefa88.net
2014-09-10 21:42 | Agen Tangkas Terpercaya

# re: 使用std::vector 的陷阱  回复  更多评论   

实应该是你的责任。的容器如果按你员变量是指针就把指针所指的地方析构

http://www.sidikjaritermurah.com
2014-09-10 21:44 | Mesin Absensi Sidik Jari

# re: 使用std::vector 的陷阱  回复  更多评论   

一旦数据结构为复杂数据结构时,则应该存储该数据的指针。

http://multibet88.org
2014-10-16 03:22 | judi online

# re: 使用std::vector 的陷阱  回复  更多评论   

http://agent108.org
2014-10-16 16:16 | judi bola

# re: 使用std::vector 的陷阱  回复  更多评论   

则应该存储该数据的指针。

http://homebet88.com
2014-10-16 16:18 | agen bola terpercaya

# re: 使用std::vector 的陷阱  回复  更多评论   

都会出问题 为复杂数 http://citibet88.com
2014-10-16 16:18 | taruhan bola

# re: 使用std::vector 的陷阱  回复  更多评论   

一旦数据结构为复杂数据结构时 http://speedbet88.com
2014-10-16 16:19 | agen bola

# re: 使用std::vector 的陷阱  回复  更多评论   

但没理由维护这个东西里面的东西。所有的容器如果按你这种思维去用,则应该存储该数据 http://www.speedbet88.biz
2014-10-25 03:24 | agen bola

# # re: 使用std::vector 的陷阱 回复 更多评论   回复  更多评论   

我們的<a代理href="http://agent108.org">朱迪·博拉網</A>最好的,最大的,最可靠的agent108 - 給促銷獎金10萬每存款將獲得5%的獎金
存取速度非常快,馬上加入我們的行列。
2014-10-28 17:30 | milestone

# re: 使用std::vector 的陷阱  回复  更多评论   

但没理由维护这个东西里面的东西。所有的容器如果按你这种思维去用,则应该存储该数据 http://www.citibet88.com
2014-10-29 18:03 | taruhan bola

# re: 使用std::vector 的陷阱  回复  更多评论   

很不错的博客,谢谢分享这个非常有趣的信息。保持成功
2014-11-18 22:03 | sbobet online

# re: 使用std::vector 的陷阱  回复  更多评论   

但没理由维护这个东西里面的东西。所有的容器如果按你这种思维去用,则应该存储该数据
2014-11-20 20:51 | agen bola terpercaya

# re: 使用std::vector 的陷阱  回复  更多评论   

www.on303.com adalah agen judi bola terpercaya di indonesia , dengan customer service yang ramah siap membantu anda semua.
2015-07-14 13:42 | judi bola

# re: 使用std::vector 的陷阱  回复  更多评论   

この記事では、読者のために非常に良いと便利です。知識の共有をありがとうございました
2016-02-18 11:12 | obat penggugur kandungan

# re: 使用std::vector 的陷阱  回复  更多评论   

私のような初心者のための読書の多くを必要とし、様々なブログ上の情報を検索します。あなたはとても素敵を共有し、私を鼓舞し、記事
2016-03-18 10:30 | cara menggugurkan kandungan

# re: 使用std::vector 的陷阱  回复  更多评论   

容器只有责任维护你给他的东西,但没理由维护这个东西里面的东西。不仅仅是vector,STL所有的容器如果按你这种思维去用
2016-04-22 13:26 | Cara Menggugurkan Kandungan

# re: 使用std::vector 的陷阱  回复  更多评论   

如果有引用记数的话,如智能指针, 就不会被释放掉了。不过如果一般编码里面不需要用到引用记数的话,还是方法1比较简便
2016-04-22 13:27 | Obat Penggugur Kandungan

# re: 使用std::vector 的陷阱  回复  更多评论   

Mate this is a very nice blog here. I wanted to comment & say that I enjoyed reading your posts & they are all very well written out. You make blogging look easy lol I’ll attemp to start a blog later today and I hope it’s half as good as your blog! Much success to you!
2016-06-13 20:18 | Dr.Aborsi Kandungan

# re: 使用std::vector 的陷阱  回复  更多评论   

I would like to start a pressure group of Australian authors whose purpose is to remind the buyers at Council Libraries that one of their functions is to support and nurture Australian Literature.
2016-06-16 11:14 | klinik apotik24

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理