为什么隐式调用迭代器析构函数



我正在为我的foo类创建一个迭代器接口,但在调试时,迭代器的析构函数在第一次测试后被隐式调用。

// Setup for test
// First test
foo::Iterator itr = obj->begin();
int first_value = (itr++)->value; // Destructor called here
// Other tests with itr

我浏览了调用堆栈,注意到这一行中的其他所有调用都按预期工作。唯一的问题似乎是,一旦执行了行中的每一个其他调用(后缀增量和箭头运算符(,就会隐式调用析构函数。为什么会发生这种情况?

后缀增量

为什么你认为每个人都告诉你不要使用它?后缀增量是一个前缀增量,带有一个额外的副本,必须构建它,然后无故销毁。

这是正确的代码:

foo::Iterator itr = obj->begin();
int first_value = itr->value; 
++itr;

表达式itr++产生两个值:旧值(将在表达式中使用(和增量值(作为副作用,在计算表达式的rhs后将在itr中(。使用(itr++)->value时,旧值应一直有效到;,然后进行销毁。

如果您不想在那里有析构函数,建议使用int first_value itr->value; ++itr;。或者,更好的是,如果您可以重新制定代码,请使用(++itr),即前缀增量。

最新更新