C++ 中类析构函数的奇怪行为

Xee*_*ych 2 c++

#include <iostream>
using namespace std;

class CCC {
public:
    CCC() {cout<<"created "<<++count<<endl;}
    ~CCC(){cout<<"deleted "<<--count<<endl;}
    int count=0;
};

CCC a;

CCC& create() { 
    return a; 
}

int main () {
    CCC result = create();
}
Run Code Online (Sandbox Code Playgroud)

https://godbolt.org/z/K3eR9t

上面的代码产生奇怪的输出。看起来析构函数被调用了 2 次,但计数没有减少。这是为什么?

created 1
deleted 0
deleted 0
Run Code Online (Sandbox Code Playgroud)

Bri*_*ian 7

count成员是非静态的,因此每个实例CCC都有自己的副本。

对于 instance acount当默认构造函数启动时,成员将设置为 0,然后递增为 1 并打印。稍后它会被销毁,count成员递减为0,并再次打印。

对于该实例result,该count成员被复制构造函数设置为 1,因为它是 1 in a。当它被销毁时,该成员递减为 0 并再次打印。

如果要跟踪存在的类的实例总数,则需要一个静态成员,

static int count = 0;
Run Code Online (Sandbox Code Playgroud)

此外,您不仅需要在默认构造函数中增加它,还需要在复制和移动构造函数中增加它。