Login | Register   
LinkedIn
Google+
Twitter
RSS Feed
Download our iPhone app
TODAY'S HEADLINES  |   ARTICLE ARCHIVE  |   FORUMS  |   TIP BANK
Browse DevX
Sign up for e-mail newsletters from DevX


Tip of the Day
Home » Tip Bank » C++
Language: C++
Expertise: Intermediate
Nov 19, 1998

The Perils of a Container's Reallocation

When a container reallocates its elements, their addresses change correspondingly. Consequently, the values of existing iterators are invalidated:
 
#include <iostream>
#include <list>
using namespace std;

void main() 
{
  list <double> payroll; 
  payroll.push_back(5000.00);
  list<double>::iterator p = payroll.begin(); //p points to the first element
  for (int i = 0 ; i < 10; i++) {
      payroll.push_back(4500.00); //insert 10 more elements to payroll; reallocation may occur
  }
      // DANGEROUS
  cout << "first element in payroll: "<< *p <<endl; // p may have been invalidated
}
In this example, it may well be the case that payroll reallocated itself during the insertion of 10 additional elements, and as a result invalidated the value of p. Using an invalid iterator yields undefined behavior. It's exactly as if you were using a pointer with the address of a deleted object. To be on the safe side, you should re-assign the iterator's value:
 
for (int i = 0 ; i < 10; i++) {
  payroll.push_back(4500.00); //insert 10 more elements to payroll; reallocation may occur
}
   p = payroll.begin(); // re-assign p 
  cout <<"first element in payroll: "<<*p<<endl;  // now safe
}
Danny Kalev
 
Comment and Contribute

 

 

 

 

 


(Maximum characters: 1200). You have 1200 characters left.

 

 

Sitemap
Thanks for your registration, follow us on our social networks to keep up-to-date