homegrown
homegrown

Reputation: 187

Resizing dynamic array in c++

I have some code that is producing unexpected results. Here is the code:

#include <iostream>
using namespace std;

int **nums;
int size;

void A(int** arr)
{
        int **resize;
        resize = new int*[size*2];

        for(int i = 0; i < size; i++)
                resize[i] = new int(*arr[i]);

        cout << endl;
        arr = resize;
        size *= 2;
        delete[] resize;

}

int main()
{
        size = 10;
        nums = new int*[size];
        for(int i = 0; i < size; i++)
                nums[i] = new int(i);

        for(int i = 0; i < size; i++)
                cout << *nums[i] << endl;

        A(nums);

        cout << endl;
        for(int i = (size / 2); i < size; i++)
                nums[i] = new int(i);

        for(int i = 0; i < size; i++)
                cout << *nums[i] << endl;

}

The function A(int** arr) works fine as far as I can tell and actually resizes the array. However, in the last for loop in main(), when the array is printing, the first two elements of the array are not 0 and 1 like it is supposed to be. Here is the result I am getting:

0
1
2
3
4
5
6
7
8
9

16331248
16331712
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

Those first two ints after the space are different each time the program is executed. After some debugging I found out that the first two elements print correctly until the iterator i=13 in the second to last for loop in main(). Then the first two elements in the array take on some large numbers. I am not sure why this is happening and I have been working on this for a couple of hours now :( Any help is appreciated.

Upvotes: 3

Views: 34384

Answers (2)

Remy Lebeau
Remy Lebeau

Reputation: 595712

A() is not modifying nums to point at the new array. Even if it were, it is deleting the new array, so nums would end up pointing at invalid memory. You need to declare the arr parameter as a reference, and delete the old array instead of the new array:

void A(int** &arr)
{
    int **resize;
    resize = new int*[size*2];

    for(int i = 0; i < size; i++)
         resize[i] = new int(*arr[i]);

    cout << endl;
    delete[] arr;
    arr = resize;
    size *= 2;
}

For what you are attempting, I think you have too much indirection. Try removing a level:

#include <iostream>
using namespace std;

int *nums;
int size;

void A(int* &arr)
{
    int *resize;
    resize = new int[size*2];

    for(int i = 0; i < size; i++)
        resize[i] = arr[i];

    cout << endl;
    delete[] arr;
    arr = resize;
    size *= 2;
}

int main()
{
    size = 10;
    nums = new int[size];
    for(int i = 0; i < size; i++)
         nums[i] = i;

    for(int i = 0; i < size; i++)
        cout << nums[i] << endl;

    A(nums);

    cout << endl;
    for(int i = (size / 2); i < size; i++)
        nums[i] = i;

    for(int i = 0; i < size; i++)
        cout << nums[i] << endl;

    delete[] nums;
}

Since you are using C++, you should be using a std::vector instead of a raw array, then you can eliminate A() altogether:

#include <iostream>
#include <vector>
using namespace std;

vector<int> nums;

int main()
{
    nums.resize(10);
    for(int i = 0; i < nums.size(); i++)
         nums[i] = i;

    for(int i = 0; i < nums.size(); i++)
        cout << nums[i] << endl;

    nums.resize(nums.size()*2);

    cout << endl << endl;

    for(int i = (nums.size() / 2); i < nums.size(); i++)
        nums[i] = i;

    for(int i = 0; i < nums.size(); i++)
        cout << nums[i] << endl;
}

Upvotes: 4

Benjamin Lindley
Benjamin Lindley

Reputation: 103693

First of all, your function, A, does not resize anything. It prints a newline character to standard output, it multiplies the global size variable by 2, and then it leaks some memory. That's it.

Now, because it multiplies size by 2 (going from 10, to 20), you run into a problem, here:

for(int i = (size / 2); i < size; i++)
    nums[i] = new int(i);

Here, you are trying to access elements 10 through 19 of the array which nums points to. But the array which nums points to only has 10 elements (numbered 0 through 9), so your code has undefined behavior.

Upvotes: 3

Related Questions