插入动态数组

Inserting into dynamic array

我正在尝试插入动态数组。除了第一次插入外,一切似乎都正常。

这是我的插入函数:

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: 1.55
day: 31, balance: 1.55
day: 96, balance: 1.55
day: 96, balance: 1.55
day: 161, balance: 51.55
day: 161, balance: 51.55
day: 161, balance: 51.55
day: 161, balance: 51.55
day: 161, balance: 51.55
day: 191, balance: 401.55
day: 221, balance: 401.55

我很困惑为什么第一个余额是垃圾地址值(或者至少我认为是这样)而不是 1 美元,但所有其他存款都是正确的。

这个函数

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 等于 0 时,您正在分配一个包含一个元素的数组

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

data[numberOfItems] = entry;
numberOfItems++;

那么你正在增加 numberOfItems。然后你再次分配一个数组,但现在有 2 个元素。

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
}