2012-01-21 1 views
2

Когда я запускаю следующий код 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 

Есть ли у кого-нибудь идеи, почему это должно происходить?

ответ

3

Ваша программа недействительна, и вы видите неопределенное поведение. Значение вашего указателя содержит адрес векторного элемента, который может быть недействительным после изменения размера vector.

Запуск программы с помощью GuardMalloc включен для вас.

+1

Чтобы развернуть это, программа выполняет 'int * ptr = & (v1 [1])', а затем выполняет 'v1.push_back (2)'. 'push_back' может аннулировать все указатели, указывающие на элементы вектора, если это требует увеличения емкости вектора. Если вы добавите строку 'v1.reserve (4);' в 'main' после создания' v1', тогда у вас будет достаточно места, и вы получите ожидаемый ответ. Конечно, по-прежнему неплохо хранить указатели таким образом, потому что это так хрупко. – bames53

+0

@ bames53 +1 приятное расширение – justin

+0

Спасибо за быстрый ответ и спасибо bames53 за разъяснение. Я думал, что должно быть какое-то неопределенное поведение, но я не мог понять, откуда он. Так что указатели на объекты в векторе - плохая идея, верно? – Edlennion

Смежные вопросы