1

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

我有一个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 在构造函数上增加,在析构函数上减少:

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 是一个私有静态整数:static int sCount;

4

2 回答 2

3

析构函数工作正常,但参与推送东西的复制构造函数不会增加计数器。

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

于 2012-10-08T19:33:33.003 回答
1

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

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

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

于 2012-10-08T19:38:28.207 回答