我正在为我的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)
,即前缀增量。