Проблема с полями, инициализированными через указатель

0

Моя проблема включает в себя следующую функцию:

/*Adds the transaction to the head of the linked list attached to the account.*/
void Bank::Worker::UpdateTransactionHistory(int account_number, string transaction, Bank *our_bank_ptr) {

    transaction_node new_trans;
    new_trans.transaction = transaction;

    if (our_bank_ptr->accounts[account_number].head == nullptr) {   //If this is the first transaction
        our_bank_ptr->accounts[account_number].head = &new_trans;

    } else {    //If this isn't the first transaction, disconnect the account from its current transaction list, connect the new transaction to the account and then connect the old list to the new transaction.
        transaction_node temp;
        temp = *(our_bank_ptr->accounts[account_number].head);

        our_bank_ptr->accounts[account_number].head = &new_trans;

        new_trans.next = &temp;
    }

if (our_bank_ptr->accounts[account_number].head) //here the correct string is printed
            cout << our_bank_ptr->accounts[account_number].head->transaction;
}

Он предназначен для обновления поля транзакции new_trans, который затем связан с остальной частью списка транзакций для данной учетной записи. Перед тем как вернуться из функции транзакции обновления, я проверяю, чтобы строка была добавлена правильно. Последняя строка функции - это cout << our_bank_ptr->accounts[account_number].head->transaction; , который выводит строку транзакции правильно.

Однако, когда я возвращаюсь из функции и сразу вызываю ту же самую строку кода, компилятор сообщает мне, что поле транзакции обновленная функция все еще не инициализирована. Это несмотря на то, что оно было передано как указатель.

Какого черта!? Я думал, что если я передам информацию в функцию через указатели, что все, что я сделал с этой информацией в течение этой функции, было постоянным? Что мне здесь не хватает?

Спасибо за помощь,

Адам

  • 0
    new_trans.next = &temp; выглядит довольно неправильно, я бы сказал, что скорее должно быть new_trans.next = temp; ...
  • 0
    Код совершенно не знает, что время жизни указателя и объекта равно -1!
Показать ещё 5 комментариев
Теги:
pointers
member-function-pointers

1 ответ

1

Вы устанавливаете указатель на локальную переменную (new_trans). Как только функция завершается, эта переменная уничтожается, а указатель свисает. Поэтому попытка разыменования приводит к неопределенному поведению. В вашем случае это в настоящее время проявляется как печать как унифицированная. Но он мог сделать что-нибудь еще.

Если вам нужны указатели и нужно, чтобы они указывали на сохраняющиеся значения, вам придется динамически выделять значения. Но реальный вопрос: нужны ли вам указатели?

  • 0
    Ах! Это имеет смысл, спасибо за вашу помощь. Мне, вероятно, не нужны указатели, но на данный момент (ха-ха) у меня нет выбора. Срок маячит!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню