Ошибка передачи указателей в XCode, но работает в Codeblocks на Windows - PullRequest
2 голосов
/ 22 января 2012

Когда я запускаю следующий код C ++ из CodeBlocks в Windows, используя компилятор mingw, все в порядке. Но когда я запускаю его на Mac OS X, он не работает:

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

Кто-нибудь знает, почему это должно происходить?

1 Ответ

3 голосов
/ 22 января 2012

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

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

...