ofi's blog

By ofi, history, 8 years ago, In English
vector<int> v;

int f()
{
	v.push_back(-1);
	return 1;
}
int main()
{
	v.push_back(0);
	cout<<v[0]<<endl;
	v[0]=f();
	cout<<v[0]<<' '<<v[1]<<endl;
		
	return 0;
}

expected output:

0

1 -1

output:

0

0 1

  • Vote: I like it
  • +49
  • Vote: I do not like it

»
8 years ago, hide # |
 
Vote: I like it +51 Vote: I do not like it

When evaluating v[0]=f(); vector resizes from 1 to 2, reallocation happens, but the left-hand side address is evaluated before reallocation happens, so you perform an assignment to the memory region that is not a content of a vector any more.

The order of evaluation of sides in an assignment operator is not defined, thus you have UB.

»
8 years ago, hide # |
Rev. 2  
Vote: I like it 0 Vote: I do not like it

The following modification produces the expected output.

int w = f(); v[0] = w;

Global variables should be used carefully so as to avoid such unexpected side effects.

Best wishes

»
8 years ago, hide # |
 
Vote: I like it +8 Vote: I do not like it

Thanks, it really was usefull.