| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 457 人关注过本帖
标题:这种操作安全么??
只看楼主 加入收藏
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
结帖率:94.44%
收藏
已结贴  问题点数:20 回复次数:4 
这种操作安全么??
deque<int> b;
 deque<int> a;

for(int i=0; i<20; ++i) {
     a.push_back(i);
}

b.assign(a.begin(), a.begin()+10);

//第一种情况
 a.resize(5);
 cout << a[9] << endl;

//第二种情况
 swap(a,b);
cout << b[8] << endl;


这种在电脑上貌似能正常编译运行, 我现在郁闷的是元素个数已经被截短了,这样操作是否是安全的?
还有就是这种操作是否会在元素个数被截短的时候,内存是否会被释放掉?(如果是的话那上面的操作就一定不安全了^_^)
希望大家能帮忙解决下哈, 有资料分享下就更好了
搜索更多相关主题的帖子: 安全 
2012-05-04 14:32
tongzhipeng
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:14
专家分:101
注 册:2012-5-1
收藏
得分:10 
这样做不安全
resize()函数可以改变向量的大小,并把一些元素初始化为适当类型的0或以无参构造初始化,被减少的类类型元素将引发析构。

如果是简单类型,你resize()减少元素个数,减少的部分可能被保留,就向你现在的情况,但是如果有后续的push_back操作,就可能会覆盖后面的数据了,resize之后相当于使得改变有效数据的范围,只有在size内的才安全,size外的不受保护,随时可能被覆盖,如果你在a.resize(5)后面执行一次a.push_back,那么a[5]的值就被覆盖了

如果是类类型,那就更加不行了,类类型直接析构,即使你没有覆盖操作,数据也可能消失了,举例如下
程序代码:
#include <deque>
#include <iostream>
#include <algorithm>
using namespace std;
class A {
public:
    A (void) {
        cout << "A无参:" << this << endl;
    }
    A (string str, int n):m_str(str),m_n(n) {
        cout << "A构造:" << this << endl;
    }
    A (const A& a) {
        m_str=a.m_str;
        m_n=a.m_n;
        cout << "A拷贝:"<<&a<<" -> "<<this<< endl;
    }
    ~A (void) {
        cout << "A析构:" << this << endl;
    }
    friend ostream& operator << (ostream& os,const A& a) {
        return os << '(' << a.m_str << ", " << a.m_n << ')';    
    }
    
private:
    string m_str;
    int m_n;
};

int main (void) {
    int i;
    deque<int> di;
    di.push_back (0);
    di.push_back (1);
    di.push_back (2);
    di.push_back (3);
    di.push_back (4);
    di.resize(3);
    for(i=0; i<5; i++)
    {
        cout << di[i] << endl;
    }    
    
    deque<A> da;
    da.push_back(A("Tom",0));
    da.push_back(A("Jim",1));
    da.push_back(A("Lily",2));
    da.push_back(A("Lucy",3));
    da.push_back(A("Jack",4));
    da.resize(3);
    for(i=0; i<5; i++) {
        cout << da[i] << endl;
    }
    
    return 0;
}

图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 tongzhipeng 于 2012-5-5 00:12 编辑 ]
2012-05-05 00:10
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
收藏
得分:0 
回复 2楼 tongzhipeng
调用da.resize(3)时为什么会调用A()构造函数啊, 能否解释下啊, 谢谢
2012-05-05 09:35
tongzhipeng
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:14
专家分:101
注 册:2012-5-1
收藏
得分:0 
没写清楚,不好意思
应该在da.resize(3)之前 插一个分割线,这样看的更清楚一点
da.push_back(A("Jack",4));
    cout << "------------------------" << endl;
    da.resize(3);
结果如下:
图片附件: 游客没有浏览图片的权限,请 登录注册


resize(3)引起了无参构造,原因是为了给新增的部分进行初始化做的准备,你如果将da.resize(3) 改成da.resize(10);就能看到
图片附件: 游客没有浏览图片的权限,请 登录注册

可以看到无参构造出来的数据拷贝给了所有的新增部分。
resize()函数可以改变向量的大小,并把一些元素初始化为适当类型的0或以无参构造初始化,被减少的类类型元素将引发析构
这句话里的以无参构造初始化,就是这个意思。

[ 本帖最后由 tongzhipeng 于 2012-5-5 19:26 编辑 ]
2012-05-05 19:21
w304920689
Rank: 2
等 级:论坛游民
帖 子:2
专家分:10
注 册:2012-5-6
收藏
得分:10 
顶起来,顶起来
2012-05-06 23:53
快速回复:这种操作安全么??
数据加载中...
 
   



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

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