2012-10-08 44 views
1

可能重复:
Why does my destructor appear to be called more often than the constructor?C++静态计数器不增加正常

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

当在矢量将它们分组,这工作正常.. ID是corrrectly设置好的:

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;

+1

你可以添加'Task'的代码吗? – Collin

+0

我想我们需要看到静态计数器代码以及如何调用这个代码以在此处取得进展。 – Julian

+0

'sCounter'增加了多少?这里没有足够的信息来回答这个问题。 – Justicle

回答

1

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

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

虽然任务被复制到载体(因此数据存储在存储器中存在的其他地方),该标准::矢量隐式拷贝构造用来此不增加计数器。

+0

如果摆脱析构函数,它工作正常......但是这是正确的吗? – jviotti

+1

这取决于你是否需要sCounter在程序结束时为零。如果是这样,如Michael建议你应该保留析构函数并实现一个*显式拷贝构造函数*来增加计数器。如果任务只存在于一个容器(如向量)中,那么您可能更好地跟踪容器本身的ID,而不是使用构造函数/析构函数和静态变量。 –

3

析构函数工作正常,但复制参与推动各地ISN东西构造不增加柜台。

只需实施显式拷贝构造函数来照顾计数器。

+0

的构造函数/析构函数第二种方法是在创建下一个任务之前调用析构函数......但是,第二种方式似乎是动态创建任务的更好方法......什么是最好的方法? – jviotti

+1

我不知道你的目标是什么。 'id'听起来像独特的标识符和你似乎并没有强制执行独特性。也许你永远不应该减少它。 –