2015-11-22 2 views
-2

Я пытаюсь добавить указатели на объект к вектору в функции, как это:Добавление указателей на объекты в векторе

вектор:

vector<struct Node*> vars; 

функция:

void fill_vec(){ 
    struct Node* temp; 
    temp = new Node(); 
    cout << token << endl; 
    temp->name = token; 
    temp->value = 0; 
    cout << temp << endl; 
    vars.push_back(temp); 
} 

fill_vec вызывается в цикле while, который останавливается, когда больше нет имен переменных.

Он добавляет правильное количество узлов к вектору, но все указывает на один и тот же объект. Токен анализируется.

выход выше:

a 
0x9c6010 
b 
0x9c6050 

печать вектор:

void print_vars(){ 
    for(int i = 0; i < vars.size(); i++){ 
     cout << "Name:" << vars[i]->name << endl; 
     cout << "Value:" << vars[i]->value << endl; 
    } 
} 

выход:

Name:b 
Value:0 
Name:b 
Value:0 

Моя мысль в том, что, когда я выделил новую память, адрес изменится. Когда я печатаю адрес temp каждый раз, когда я вызываю функцию, адрес тот же. Я неправильно печатал адрес. Адрес для каждого вызова функции отличается. Заранее спасибо за помощь.

+2

Можете ли вы создать [минимальный, завершающий и проверяемый пример] (http://stackoverflow.com/help/mcve)? –

+0

Невозможно сделать какие-либо предложения на основании ограниченной информации. – user4581301

+0

'vector ' выглядит как C с классами. Сделайте это 'vector '. –

ответ

0

Я думал, что когда я выделил новую память, адрес изменится.

Это действительно так.

Когда я печатаю адрес температуры каждый раз, когда я вызываю функцию, адрес тот же.

Это потому, что вы печатаете из адреса локальной переменной, которая происходит проживать по одному адресу стека памяти каждый раз, когда fill_vec() называется. Вместо этого вы должны распечатать адрес памяти выделенного Node.

Изменить эту строку:

cout << &temp << endl; 

Для этого:

cout << temp << endl; 
+0

Хорошо. После изменения, что напечатанные адреса отличаются, но вектор все еще печатает то же, что и выше. Какие-нибудь дальнейшие идеи? –

+0

Учитывая код, который вы показали, это просто невозможно. Код, который вы не показывали, должен делать что-то, чтобы изменить содержимое «vars» после его заполнения и перед его печатью. –

0

Как оказалось, это был маркер. Token - char *, и я не использовал strdup(). Поэтому каждый раз, когда я обновлял токен, имя менялось в каждом объекте.

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