C++ 如何准确地检查类构造函数计数?

C++ 如何准确地检查类构造函数计数?,c++,class,C++,Class,我正在构造一个包含类create count的新类。我的代码中是否还有其他异常,请检查创建计数 我想知道A类的计数 因此,我创建了一个包含createCount的类,当调用构造函数或析构函数时,该类会增加或减少 A类{ 公众: 静态int-createCount; int m; A(int m=0):m(m){ createCount++; } ~A(){ 创建计数--; } }; INTA::createCount=0; 我认为上面的代码没有问题,但当我使用vector时,createCou

我正在构造一个包含类create count的新类。我的代码中是否还有其他异常,请检查创建计数

我想知道A类的计数

因此,我创建了一个包含
createCount
的类,当调用构造函数或析构函数时,该类会增加或减少

A类{
公众:
静态int-createCount;
int m;
A(int m=0):m(m){
createCount++;
}
~A(){
创建计数--;
}
};
INTA::createCount=0;
我认为上面的代码没有问题,但当我使用
vector
时,createCount的变化出乎意料

int main() {
    vector<A> aVector;
    aVector.push_back( A(1) ); // expected 1, real 0
    aVector.push_back( A(2) ); // expected 2, real -1
    aVector.push_back( A(3) ); // expected 3, real -3
}
但我不确定我的答案是否还有其他例外或问题

我想知道上面的代码仍然有同样的问题

谢谢你阅读我的问题

我想知道上面的代码仍然有同样的问题

答案正如你所说:违反三五法则。如果没有复制构造函数,
std::vector::push_back
将使用POD复制,它只是复制
a
中的数据成员,但不知道您正在寻找的引用计数副作用

再深入一点:当您调用
aVector.push_back(a(1))
时,首先
a(1)
构造一个
a
的临时实例。然后,
push_back
会将该值复制(或移动)到向量中,最后临时值被销毁

由于您既不提供复制构造函数也不提供移动构造函数,因此位于向量中的
a
的新副本不会增加您的计数。但是当临时
A(1)
被销毁时,计数仍然减少。因此,每次推送操作都会导致计数减少

我修复了你的复制构造函数,因为它是错误的:

A(const A& other) : A(other.m) {}
在添加复制构造函数之后,如果需要,您需要指定move构造函数。在这种情况下,它有点微不足道,因为不需要移动实际数据,所以您可以再次使用
A(int)
构造函数

A(A&& other) : A(other.m) {}
当然,移动实际上不应该增加或减少计数,但在
a
中没有逻辑将其分开


还要注意,您的代码不是线程安全的。如果需要,那么使用
std::atomic
进行计数。

为什么需要知道类的计数?如果你成功地编译了它,目的是什么?如果更改编译器选项或编译器,则使用此“计数”将得到不同的结果。这已接近一个。您忘记说明默认的复制/移动构造函数。向量重新分配将移动/复制大量内容。@PaulMcKenzie我将此代码用于练习
boost::shared\u ptr
。实际上,我想知道什么时候分配内存和空闲时间。谢谢。当你写右值时,实际上是指临时对象。右值是一个表达式。