C++静态计数器未正确增加

C++ static counter not increasing correctly

本文关键字:增加 静态 计数器 C++      更新时间:2023-10-16

可能的重复项:
为什么我的析构函数似乎比构造函数更频繁地被调用?

我有一个static sCounterint id来订购带有 id 的实例。

将它们分组到向量中时,这工作正常。ID 的设置正确:

Task t("1st Task");
Task t2("2nd Task");
    Task t3("3rd Task");
std::vector<Task> myTasks;
myTasks.push_back(t);
myTasks.push_back(t2);
myTasks.push_back(t3);

第一个任务的 ID 为 0,第二个任务的 ID 为 1,第三个任务的 ID 为 2。但是,如果我这样做:

std::vector<Task> myTasks;
myTasks.push_back(
   Task("First Task"));
myTasks.push_back(
   Task("Second Task"));
myTasks.push_back(
   Task("Third Task"));

静态 sCount 值开始给出奇怪的结果:

第一个获取 ID 1,

第二个也获取 ID 1,第三个获取 ID 0。

为什么创建这样的对象会弄乱静态计数器?

构造函数上的 sCounter 增加,析构函数上的 sCounter 减少:

int Task::sCount = 0;
Task::Task(std::string text) {
    this->setText(text);
    this->setStatus(1);
    time_t now = time(0);
    timestamp = *localtime(&now);
    std::cout << "Count from " << sCount;
    sCount++;
    std::cout << " to --> " << sCount << "n";
    this->setID(); // set the current sCount to ID
}
Task::~Task() {
    --sCount;
}

sCounter 是一个私有静态 int: static int sCount;

构函数工作正常,但参与推动内容的复制构造函数不是递增计数器。

只需实现显式复制构造函数来照顾计数器。

在第二种情况下,传递给push_back的每个 Task 实例都是一个临时变量。这意味着一旦对 push_back 的调用完成,就会调用其析构函数。然后,析构函数在创建下一个任务之前递减计数器。

myTasks.push_back( Task("First Task") ); // Task's destructor is called before the next line

尽管 Task 被复制到向量中(因此数据存在于内存中的其他位置),但 std::vector 用于此目的的隐式复制构造函数不会递增计数器。