首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

容器内对象的析构函数 代码很短解决思路

2012-04-02 
容器内对象的析构函数代码很短C/C++ codeclass a{public:~a(){cout~aty }a(){++testtytestc

容器内对象的析构函数 代码很短

C/C++ code
class a{public:    ~a()    {        cout<<"~a"<<ty<<' ';    }    a(){++test;ty=test;cout<<ty;}public:    static int test;    int ty;};int a::test=0;int _tmain(int argc, _TCHAR* argv[]){    a a1; a a2; vector<a> v; v.push_back(a1); v.push_back(a2);return 0;}

为什么会调用七次析构函数? 两个对象析构函数的调用次数不一样
12~a1 ~a1 ~a2 ~a1 ~a2 ~a2 ~a1 请按任意键继续. . .
请给解释一下

[解决办法]
1.有可能产生临时对象
2.你在push_back(a2)的时候vector有可能重新分配过内存.
[解决办法]
这个应该和编译器有关
[解决办法]
CSS code
int _tmain(int argc, _TCHAR* argv[]){    a a1; a a2; vector<a> v; v.reserve(10);//<----------加上这句,应该明白了吧。主要是因为 vector动态内存管理机制导致的 v.push_back(a1); v.push_back(a2);return 0;}
[解决办法]
很多人认为vector <a> v;这里需要一次,我不赞同,这里v本来就不含元素何来一次
[解决办法]
1)push_back(a2)时,因为插入一个a1时v的容量为1,此时没有新的空间来存放a2。因此,在执行insert(end(), _Val);时,就会出现重新生成一个新的vector<a> v,其容量是以前的两倍(通常是这样)。而原来的v被释放,v中只有一个元素a1,这也就是第一次输出~a1。
2)在return 0;发生第一次析构,首先是v调用_Tidy();释放vector<a> v,v中有两个元素a1、a2,因此输出~a1~a2。
3)第二次析构,释放临时变量a1,a2;按其定义的逆顺序释放,因此输出~a2~a1。

我这只有5次析构 VS2008下

[解决办法]
这个和具体的stl实现有关

5次:
当push_back(a1)的时候,空间配置器会配置2个对象的空间

7次:
策略比较不好,每push_back一次,就再重分配一次
[解决办法]
vs2003下也是7次。

[code=C/C++]
int main()
{
a a1;
a a2;
vector<a> v;
cout << endl<< "v.size ="<< v.size()<< endl;

// v.reserve(10);

v.push_back(a1);
cout << endl<< "v.size ="<< v.size()<< endl;

v.push_back(a2);
cout << endl<< "v.size ="<< v.size()<< endl;

return 0;
}code]
运行结果:
12
v.size =0
~a1
v.size =1
~a1 ~a2
v.size =2
~a1 ~a2 ~a2 ~a1 Press any key to continue

加上v.reserve(10)后运行结果:
12
v.size =0

v.size =1

v.size =2
~a1 ~a2 ~a2 ~a1 Press any key to continue

可以看出来,在vector空间不足的时候,会新建立一个足够的新空间(新的vector)来存放接下来的元素,在过渡中,释放掉原vector里的元素,调用析构,然后最后在return之后,析构掉a1,a2,然后析构vector中的元素,进而析构两次
[解决办法]
探讨
引用:
初步验证的确和分配机制有关
但是reserve是什么作用?分配n个字节空间,还是分配n个元素的空间?

解释一下 重分配的时候怎么拷贝的?怎么会导致那么多个析构函数


分配 n个元素的空间

vs2005 stl的机制是 :

当发现预留空间不够的时候 就会重新分配 2*预留空间 ,然后拷贝 元素进入 新分配的空间
同时 回收 原分配的空间

热点排行