可能重复:
Why does my destructor appear to be called more often than the constructor?
我有一个static sCounter
和int 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;
答案 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用于此的隐式复制构造函数不会增加计数器。