C ++静态计数器没有正确增加

时间:2012-10-08 19:27:37

标签: c++

  

可能重复:
  Why does my destructor appear to be called more often than the constructor?

我有一个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);

任务编号1的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在构造函数上增加,在析构函数上减少:

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;

2 个答案:

答案 0 :(得分:3)

析构函数工作正常,但复制构造函数涉及推送内容并不会增加计数器。

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

答案 1 :(得分:1)

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

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

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