question about C++ STL

chongchong

知名会员
注册
2003-11-04
消息
163
荣誉分数
0
声望点数
126
Source code :


#include <iostream>
#include <iomanip>
#include <fstream>
#include <vector>


using namespace std;

class CDummy {
public:

CDummy() {
cout << "CDummy construct" << endl;
//cout << "address = " << hex << static_cast<void*>(buf) << endl;
}

virtual ~CDummy() {
cout << "CDummy destructor" << endl;
}

private:
char buf[102410];
};


int main(void) {

vector<CDummy> storage;

for(int i=0; i<2; i++) {
CDummy dummy;
storage.push_back(dummy);
}

cout << "----------------------" << endl;



}


output from execution:

CDummy construct
CDummy destructor
CDummy construct
CDummy destructor
CDummy destructor <-----------????????
----------------------
CDummy destructor
CDummy destructor


Can any one explain that why I get a extra destructor call which marked as <---------?????
 
STL management, when you .push_back
Do not need to worry.
 
楼上说的技术上正确。一下是我的解释,请指正。

楼主的问题实际上是因为:
1。以你的代码,storage初始化方式是以默认的参数调用默认的vector 构造函数(constructor),导致vector的预设容量(capacity)是0
2。因为容量是0,所以每次压入新的数据,都会引起vector内部因为容量不足而重新分配空间,vector内部首先把老的对象(object)复制到新的地方去,然后在调用其析构函数(destructor)来把老的空间释放掉。
3。我不知道你用的是什么C++编译器。我用的是VC8 SP1,以下是你的程序的输出结果:

CDummy construct ----堆变量第一次构造
CDummy destructor----来自vector内部,看我的解释#2
CDummy destructor----堆变量第一次析构
CDummy construct---- 堆变量第二次构造
CDummy destructor----来自vector内部,看我的解释#2....因增容引起的对先前压入vector的对象的析构
CDummy destructor----来自vector内部,看我的解释#2....因增容引起的对本次压入vector的对象的析构
CDummy destructor----堆变量第二次析构
----------------------
CDummy destructor----storage析构造成的内部元素的释放,共两次
CDummy destructor
Press any key to continue . . .

4。如果我把你的循环改成三次:for(int i=0; i<3; i++),就更能说明问题了。

CDummy construct----- 堆变量第一次构造
CDummy destructor---- 来自vector内部,看我的解释#2
CDummy destructor---- 堆变量第一次析构
CDummy construct-----堆变量第二次构造
CDummy destructor---- 来自vector内部,看我的解释#2....因增容引起的对先前压入vector的对象的析构
CDummy destructor---- 来自vector内部,看我的解释#2....因增容引起的对本次压入vector的对象的析构
CDummy destructor---- 堆变量第二次析构
CDummy construct-----堆变量第三次构造
CDummy destructor---- 来自vector内部,看我的解释#2....因增容引起的对最早压入vector的对象的析构
CDummy destructor---- 来自vector内部,看我的解释#2....因增容引起的对先前压入vector的对象的析构
CDummy destructor---- 来自vector内部,看我的解释#2....因增容引起的对本次压入vector的对象的析构
CDummy destructor-----堆变量第三次析构
----------------------
CDummy destructor----storage析构造成的内部元素的释放,共三次
CDummy destructor
CDummy destructor
Press any key to continue . . .

5。建议:尽量采用引用方式(pass by reference)把数据压入vector,这样可不会引起对 对象的强复制。象你的这个例子,每次往vector里压入数据,你压进去的不是一个整数这么简单,你压进去的实际是CDummy的一个复制品,也就是C++对调用缺省的copy constructor来产生一个复制品。当处理大量数据时候,这会慢得不可接受。
6。如果你采用了#5建议的话,你就不能再用局部的堆变量dummy,需要改成stack方式的变量,并且别忘了释放。
7。pass by reference是C++一种很好的传递方式,善加利用是你的程序变得高效,而且安全。
 
后退
顶部