Придуманный пример ниже показывает повторяющиеся адреса, видимые внутри цикла.То же самое явление проявляется, когда я строю как с оптимизацией, так и без нее на MinGW GCC 4.5.0.Проблема, с которой я сталкиваюсь, заключается в том, что когда я создаю вектор внутри цикла, иногда кажется, что внутренний массив занимает те же адреса памяти, что и вектор, созданный на предыдущей итерации.Мой вопрос заключается в том, что вызывает это?
Вопрос относится ко мне, потому что у меня был некоторый код, который (по существу) передавал ссылку на вектор, созданный внутри цикла, в новый поток.Потоки попирали друг друга и вызывали сбой программы.Когда я изменил код для создания векторов вне цикла, программа работала нормально и показала те же результаты, что и однопоточная версия моей программы.
#include <iostream>
using std::cout;
using std::endl;
#include <vector>
using std::vector;
#include <cstdlib>
//using NULL;
#include <algorithm>
using std::for_each;
#include <tr1/functional>
using std::tr1::bind;
using std::tr1::placeholders::_1;
template<typename T>
void write_address(T const & arg){
cout<<" "<<&arg;
}
template <typename T>
void write_container_addresses(vector<T> const & container){
for_each(container.begin(),container.end(),
write_address<T>);
cout<<endl;
}
template <typename T>
void write_container_container_addresses(
vector<vector<T> > const & container){
for_each(container.begin(),container.end(),
write_container_addresses<T>);
}
int main() {
vector<vector<int> > stacked_vector(5);
for_each(stacked_vector.begin(),stacked_vector.end(),
bind(&vector<int>::reserve,_1,9));
for_each(stacked_vector.begin(),stacked_vector.end(),
bind(&vector<int>::resize,_1,5,0));
cout<<"stacked vector addresses"<<endl;
for (size_t i = 0;i<stacked_vector.size();i++){
write_container_addresses<int>(stacked_vector[i]);
}
cout<<endl;
cout<<"another print of stacked vector addresses"<<endl;
write_container_container_addresses(stacked_vector);
cout<<endl;
vector<vector<int> > other_stacked_vector;
cout<<"other vector addresses"<<endl;
for (size_t i = 0;i<stacked_vector.size();i++){
other_stacked_vector.push_back(vector<int>());
other_stacked_vector.back().reserve(9);
other_stacked_vector.back().resize(5,0);
write_container_addresses<int>(other_stacked_vector[i]);
}
cout<<endl;
cout<<"another write of other vector addresses"<<endl;
write_container_container_addresses<int>(other_stacked_vector);
return 0;
}
Вывод:
C:\workspace\test_of_pointer_vector_addresses\Debug>test_of_pointer_vector_addre
sses.exe
stacked vector addresses
0x3e3e08 0x3e3e0c 0x3e3e10 0x3e3e14 0x3e3e18
0x3e3e38 0x3e3e3c 0x3e3e40 0x3e3e44 0x3e3e48
0x3e3e68 0x3e3e6c 0x3e3e70 0x3e3e74 0x3e3e78
0x3e3e98 0x3e3e9c 0x3e3ea0 0x3e3ea4 0x3e3ea8
0x3e3ec8 0x3e3ecc 0x3e3ed0 0x3e3ed4 0x3e3ed8
another print of stacked vector addresses
0x3e3e08 0x3e3e0c 0x3e3e10 0x3e3e14 0x3e3e18
0x3e3e38 0x3e3e3c 0x3e3e40 0x3e3e44 0x3e3e48
0x3e3e68 0x3e3e6c 0x3e3e70 0x3e3e74 0x3e3e78
0x3e3e98 0x3e3e9c 0x3e3ea0 0x3e3ea4 0x3e3ea8
0x3e3ec8 0x3e3ecc 0x3e3ed0 0x3e3ed4 0x3e3ed8
other vector addresses
0x3e3f10 0x3e3f14 0x3e3f18 0x3e3f1c 0x3e3f20
0x3e3f10 0x3e3f14 0x3e3f18 0x3e3f1c 0x3e3f20
0x3e3f10 0x3e3f14 0x3e3f18 0x3e3f1c 0x3e3f20
0x3e2430 0x3e2434 0x3e2438 0x3e243c 0x3e2440
0x3e2430 0x3e2434 0x3e2438 0x3e243c 0x3e2440
another write of other vector addresses
0x3e3f40 0x3e3f44 0x3e3f48 0x3e3f4c 0x3e3f50
0x3e3f60 0x3e3f64 0x3e3f68 0x3e3f6c 0x3e3f70
0x3e24c8 0x3e24cc 0x3e24d0 0x3e24d4 0x3e24d8
0x3e24e8 0x3e24ec 0x3e24f0 0x3e24f4 0x3e24f8
0x3e2430 0x3e2434 0x3e2438 0x3e243c 0x3e2440