2015-09-26 2 views
-1

Я пишу функцию вставки для хэш-таблицы, и мне нужно создать пару ключ-значение (элемент структуры) в этой функции. Я обнаружил, что если я создам его в стеке, например. Item item(key, value);, то каждый раз, когда я вызываю «Вставить», в этом же месте в стеке будет создана пара ключей и значений. Этого не произойдет, если я использую память распределения кучи. Почему они находятся в одном месте в стеке?Стек, выделенный структурой всегда в том же месте?

Вот мой пример кода:

void Insert (int key, int value) { 
int hash_value = Hash(key); 
if (hash_value >= table.size() || hash_value < 0) { 
    throw std::out_of_range("Cannot insert.");  
} else { 
    Item *item = new Item(key, value); // This will work 
    // Item item2(key, value); This does not work 
    if (!table[hash_value]) { // there is not item in this cell 
    Cell *c = new Cell(0, item); // Cell *c = new Cell(0, &item2) 
    table[hash_value] = c; 
    } else { // try next one, if occupied, the one after ... 
    int index = hash_value + 1; 
    while (table[index]) { 
     ++index; 
     if (index == table.size()) { 
     index = 0; 
     } else if (index == hash_value) { 
     throw std::out_of_range("Opps! The table is full! Cannot insert!"); 
     } 
    } 
    Cell *c = new Cell(0, item); // Cell *c = new Cell(0, &item2) 
    table[index] = c; 
    } 
} 

}

Элемент2 в стек выделяется и способ, которым я использовал это в комментариях.

+1

Пожалуйста, уменьшите код, прежде чем спрашивать здесь, это не имеет никакого отношения к таблицам хэшей, например. Вы также должны использовать контейнеры C++ ('std :: unordered_map'). –

ответ

2

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

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