This is actually a really obvious "issue" but I found that some developers (usually the inexperienced ones) simply don't think about this horrible source of bugs:). Now let's see the problem:
#include <iostream> | |
#include <vector> | |
int main() | |
{ | |
std::vector<int> intVector; | |
intVector.push_back(1); | |
// We get the pointer to the first element from our vector. | |
int* pointerToInt = &intVector[0]; | |
std::cout << "The value of our int is: " << *pointerToInt << std::endl; | |
// Add two more elements to trigger vector resize. During | |
// resize the internal array is deleted causing our pointer | |
// to point to an invalid location. | |
intVector.push_back(2); | |
intVector.push_back(3); | |
std::cout << "The value of our int is: " << *pointerToInt << std::endl; | |
return 0; | |
} |
The value of our int is: 1 The value of our int is: -572662307The explanation for this is simple. If you think that is a great idea to hold pointers to vector elements, you are wrong. The vector is basically a resizable array and the actual resize operation is:
- Create a new and bigger array.
- Copy all content from the current array to the newly allocated array.
- Delete the current array and replace it with the newly created array.