Вставка в массив Dynami c - PullRequest
       63

Вставка в массив Dynami c

1 голос
/ 23 февраля 2020

Я пытаюсь вставить в динамический c массив. Кажется, все работает, кроме первой вставки.

Вот моя функция вставки:

void account::insert(value_type entry) {

if (numberOfItems == 0) {
    data = new value_type[numberOfItems + 1];
}

data[numberOfItems] = entry;
numberOfItems++;

value_type* temp = new value_type[numberOfItems + 1];
for (size_t i = 0; i < numberOfItems; i++) {
    temp[i] = data[i];
}

delete[] data;
data = temp;
}

Здесь я называю свою вставку:

void account::deposit(double deposit) {
balance += deposit;
insert(balance);
}

здесь мои тесты:

 account savings(3.00);
    savings.deposit(1.00);
    cout << savings << endl;


    savings.advanceDay(7);
    cout << savings << endl;


    savings.deposit(450.55);
    cout << savings << endl;


    savings.advanceDay(23);
    cout << savings << endl;


    savings.advanceDay(65);
    cout << savings << endl;

    //Deposit more
    savings.deposit(1000);
    cout << savings << endl;

    savings.advanceDay(65);
    cout << savings << endl;

вот вывод, который я получаю:

Account Tester
day: 1, balance: $-6277438562204192487878988888393020692503707483087375482269988814848.00
day: 8, balance: $-6277438562204192487878988888393020692503707483087375482269988814848.00
day: 8, balance: $451.55
day: 31, balance: $451.55
day: 96, balance: $451.55
day: 96, balance: $451.55
day: 161, balance: $1451.55
day: 161, balance: $1451.55
day: 161, balance: $1451.55
day: 161, balance: $1451.55
day: 161, balance: $1451.55
day: 191, balance: $11401.55
day: 221, balance: $11401.55

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

1 Ответ

2 голосов
/ 23 февраля 2020

Эта функция

void account::insert(value_type entry) {

if (numberOfItems == 0) {
    data = new value_type[numberOfItems + 1];
}

data[numberOfItems] = entry;
numberOfItems++;

value_type* temp = new value_type[numberOfItems + 1];
for (size_t i = 0; i < numberOfItems; i++) {
    temp[i] = data[i];
}

delete[] data;
data = temp;
}

Имеет ошибку. Когда numberOfItems us равно 0, вы выделяете массив с одним элементом

if (numberOfItems == 0) {
    data = new value_type[numberOfItems + 1];
}

data[numberOfItems] = entry;
numberOfItems++;

Затем вы увеличиваете numberOfItems. И затем вы снова выделяете массив, но теперь с двумя элементами.

value_type* temp = new value_type[numberOfItems + 1];

, и в результате массив имеет элемент с неопределенным значением.

Нет смысла отделять функция в двух фрагментах кода, которые выделяют память.

Первоначально данные элемента данных должны быть равны nullptr. Функция может выглядеть как

void account::insert( const value_type &entry ) 
{
    value_type* temp = new value_type[numberOfItems + 1];

    for ( size_t i = 0; i < numberOfItems; i++ ) 
    {
        temp[i] = data[i];
    }

    temp[numberOfItems++] = entry;

    delete [] data;

    data = temp
}
...