为什么用容器初始化类计数器会减少?

来源:百度知道 编辑:UC知道 时间:2024/09/22 15:41:14
#include <iostream>
#include <vector>
using namespace std;
class A
{
public:
A(){count++;}
~A(){count--;}
static void getc(){cout<<count<<endl;}
private:
static int count;
};
int A::count=0;
void main()
{
vector <A> a;
a.push_back(A());
a.push_back(A());
A::getc();
}
我用的vc++2008,计数器的结果是-1,用2005也会出现相同的状况,为什么呢?怎么解决这个问题?

帮你跟踪到xmemory文件第46-53行,代码如下:
// TEMPLATE FUNCTION _Construct
template<class _T1,
class _T2> inline
void _Construct(_T1 _FARQ *_Ptr, const _T2& _Val)
{ // construct object at _Ptr with value _Val
void _FARQ *_Vptr = _Ptr;
::new (_Vptr) _T1(_Val);
}
可以看到这行代码:
::new (_Vptr) _T1(_Val);

它是调用了对象的拷贝(复制)构造函数。而没有调用你定义的无参构造函数,但是在插入对象时,它重新分配了一块内存来存放新的对象,所以调用了析构函数,所以当插入一个对象时,计数器正常,因为这时候并没有任何对象被释放,当插入第二个对象时,它分配两个对象的内存空间,所以将第一个对象和第二个对象COPY到新的内存空间,同时将原有的第一个对象释放,所以调用了一次析构函数,那么计数器自然为-1。

可以为对象增加一个拷贝构造函数以解决此问题。

例如:

class A
{
public:
public:
A(){
count++;
}
A( const A& obj )
{
count ++;
//other copy operations
}
~A()
{
count--;
}
static void getc(){cout<<count<<endl;}
private:
static int count;
};

---你在vector那里设个断点,然后用F11一句一句看下去吧