Когда я запускаю следующий код C++ из CodeBlocks в Windows с использованием компилятора mingw, все в порядке. Но, когда я запускаю его на Mac OS X не работает:Ошибка передачи указателей в Xcode, но работает в Codeblocks на окнах
void func (vector<int> &v1, vector<vector< int *> > &v2);
int main()
{
vector<int> v1;
v1.push_back(0);
vector<vector <int *> > v2;
vector<int *> vTemp;
int x = 0;
int * ptr = &x;
vTemp.push_back(ptr);
v2.push_back(vTemp);
func(v1,v2);
cout<<*(v2[0][1])<<endl;
return 0;
}
void func (vector<int> &v1, vector<vector< int *> > &v2)
{
v1.push_back(1);
int *ptr = &(v1[1]);
v2[0].push_back(ptr);
cout<<*(v2[0][1])<<endl;
v1.push_back(2);
int *ptr2 = &(v1[2]);
v2[0].push_back(ptr2);
v1.push_back(3);
int *ptr3 = &(v1[3]);
v2[0].push_back(ptr3);
}
Выходной сигнал я ожидал (и получить на Windows) является
1
1
Но на Mac, я получаю
1
0
Есть ли у кого-нибудь идеи, почему это должно происходить?
Чтобы развернуть это, программа выполняет 'int * ptr = & (v1 [1])', а затем выполняет 'v1.push_back (2)'. 'push_back' может аннулировать все указатели, указывающие на элементы вектора, если это требует увеличения емкости вектора. Если вы добавите строку 'v1.reserve (4);' в 'main' после создания' v1', тогда у вас будет достаточно места, и вы получите ожидаемый ответ. Конечно, по-прежнему неплохо хранить указатели таким образом, потому что это так хрупко. – bames53
@ bames53 +1 приятное расширение – justin
Спасибо за быстрый ответ и спасибо bames53 за разъяснение. Я думал, что должно быть какое-то неопределенное поведение, но я не мог понять, откуда он. Так что указатели на объекты в векторе - плохая идея, верно? – Edlennion