Bonjour à tous, j’ai rencontré un problème très intriguant avec les références en c++, voici un bout de code pour le reproduire :
#include <iostream>
#include <vector>
struct Item{
int i;
};
struct Cont {
Item& item;
};
int main()
{
int s = 5;
std::vector<Item> items;
std::vector<Cont> conts;
for (int i=0; i<s; ++i) {
items.push_back(Item{i});
conts.push_back(Cont{items[i]});
}
for (int i=0; i<s; ++i) {
std::cout << std::addressof(items[i]) << ' ' << items[i].i << std::endl << std::addressof(conts[i].item) << ' ' << conts[i].item.i << std::endl << std::endl;
}
return 0;
}
/*
output :
0x1b406c0 0
0x1b40b20 -674317320
0x1b406c4 1
0x1b40b64 0
0x1b406c8 2
0x1b40b48 -674317448
0x1b406cc 3
0x1b40b4c 32555
0x1b406d0 4
0x1b406d0 4
*/
Cont
contenant une référence à Item
, les adresses devraient être les mêmes, mais ici ce n’est pas le cas, sauf pour le dernier élément…
Par contre si je remplis le vecteurs dans 2 boucles séparées, le résultat est bon :
#include <iostream>
#include <vector>
struct Item{
int i;
};
struct Cont {
Item& item;
};
int main()
{
int s = 5;
std::vector<Item> items;
std::vector<Cont> conts;
for (int i=0; i<s; ++i) {
items.push_back(Item{i});
}
for (int i=0; i<s; ++i) {
conts.push_back(Cont{items[i]});
}
for (int i=0; i<s; ++i) {
std::cout << std::addressof(items[i]) << ' ' << items[i].i << std::endl << std::addressof(conts[i].item) << ' ' << conts[i].item.i << std::endl << std::endl;
}
return 0;
}
/*
output :
0x118ab60 0
0x118ab60 0
0x118ab64 1
0x118ab64 1
0x118ab68 2
0x118ab68 2
0x118ab6c 3
0x118ab6c 3
0x118ab70 4
0x118ab70 4
*/
Autre curiosité, si j’utilise les deux manières de remplir mes vecteurs,les valeurs de i sont correctes sauf pour i=0 et i=1, mais les adresses ne matchent pas :
#include <iostream>
#include <vector>
struct Item{
int i;
};
struct Cont {
Item& item;
};
int main()
{
int s = 5;
std::vector<Item> items;
std::vector<Cont> conts;
for (int i=0; i<s; ++i) {
items.push_back(Item{i});
}
for (int i=0; i<s; ++i) {
conts.push_back(Cont{items[i]});
}
for (int i=0; i<s; ++i) {
items.push_back(Item{i});
conts.push_back(Cont{items[i]});
}
for (int i=0; i<2*s; ++i) {
std::cout << std::addressof(items[i]) << ' ' << items[i].i << std::endl << std::addressof(conts[i].item) << ' ' << conts[i].item.i << std::endl << std::endl;
}
return 0;
}
/*
output :
0x22aa740 0
0x22aab60 36349616
0x22aa744 1
0x22aab64 0
0x22aa748 2
0x22aab68 2
0x22aa74c 3
0x22aab6c 3
0x22aa750 4
0x22aab70 4
0x22aa754 0
0x22aab60 36349616
0x22aa758 1
0x22aab64 0
0x22aa75c 2
0x22aab68 2
0x22aa760 3
0x22aa74c 3
0x22aa764 4
0x22aa750 4
*/
Bref je suis complètement perdu, quelqu’un aurait-il une explication à tout ça ? merci d’avance !
+0
-0