Search code examples
c++pointersdynamic-memory-allocationpointer-to-pointer

Dynamic memory addressing and deallocation


I'm trying to solve a problem for a web tutorial (non-marked) where I'm implementing a dynamic array. However, it fails in two places:

  1. Where I try to delete a dynamic array in function ResizeDynamicArray(...)
  2. It is outputting incorrect data. I expect to see:

    10 20 30 40 50
    10 30 40 50
    10 30 50
    

    ...but I get this instead:

    8723216 8716480 701955994 201375930 10 
    8723216 701955994 201375930 10 
    8723216 701955994 10
    

Requirements of the solution are:

  • Use pointer to pointer instead of reference to pointer (btw I have successfully implemented a reference to pointer solution, but I am trying to figure out the pointer to pointer solution)
  • No use of malloc/free
  • No use of vectors
  • Must use the declarations as shown

Could someone please suggest what I'm doing wrong?

int* CreateDynamicArray(int capacity, int &size);
void DeleteDynamicArray(int* dynamicArray, int &size);
void InsertElement(int* dynamicArray, int element, int &size, int &capacity);
void DeleteElement(int* dynamicArray, int elementIndex, int &size);
void ResizeDynamicArray(int** dynamicArray, int newCapacity);
void PrintArray(int *ptrArray, int capacity);

#include <iostream>

int main()
{
    int size = 0;
    int capacity = 0;

    int* ptrArray = CreateDynamicArray(capacity, size);

    InsertElement(ptrArray, 10, size, capacity);
    InsertElement(ptrArray, 20, size, capacity);
    InsertElement(ptrArray, 30, size, capacity);
    InsertElement(ptrArray, 40, size, capacity);
    InsertElement(ptrArray, 50, size, capacity);
    PrintArray(ptrArray, size);

    DeleteElement(ptrArray, 1, size);
    PrintArray(ptrArray, size);
    DeleteElement(ptrArray, 2, size);
    PrintArray(ptrArray, size);

    DeleteDynamicArray(ptrArray, size);

    ptrArray = nullptr;

    return 0;
}


int* CreateDynamicArray(int capacity, int &size)
{
    size = 0;
    return new int[capacity];
}


void DeleteDynamicArray(int* dynamicArray, int &size)
{
    if (dynamicArray != nullptr) {
        delete[] dynamicArray;
        dynamicArray = nullptr;
    }
    size = 0;
}


void InsertElement(int* dynamicArray, int element, int &size, int &capacity)
{
    if (size > capacity)
        capacity += 2;
    else
        capacity += 1;
    ResizeDynamicArray(&dynamicArray, capacity);
    dynamicArray[size] = element;
    size++;
}


void DeleteElement(int* dynamicArray, int elementIndex, int &size)
{
    for(int i = elementIndex + 1; i < size; i++)
        dynamicArray[i - 1] = dynamicArray[i];
    size--;
}


void ResizeDynamicArray(int** dynamicArray, int newCapacity)
{
    int *newArray = new int[newCapacity];
    for(int i = 0; i < newCapacity; i++) {
        newArray[i] = (*dynamicArray)[i];
    }
//  if (*dynamicArray != nullptr) {
//      delete [] *dynamicArray;
//  }
    *dynamicArray = newArray;
}


void PrintArray(int *dynamicArray, int size)
{
    for (int i = 0; i < size; i++) {
        std::cout << dynamicArray[i] << " ";
    }
    std::cout << std::endl;
}

Solution

  • I believe I have the solution, thanks to R Sahu.

    int* CreateDynamicArray(int capacity, int &size);
    void DeleteDynamicArray(int* dynamicArray, int &size);
    void InsertElement(int** dynamicArray, int element, int &size, int &capacity);
    void DeleteElement(int** dynamicArray, int elementIndex, int &size);
    void ResizeDynamicArray(int** dynamicArray, int newCapacity);
    void PrintArray(int *ptrArray, int capacity);
    
    #include <iostream>
    
    int main()
    {
        int size = 0;
        int capacity = 0;
    
        int* ptrArray = CreateDynamicArray(capacity, size);
    
        InsertElement(&ptrArray, 10, size, capacity);
        InsertElement(&ptrArray, 20, size, capacity);
        InsertElement(&ptrArray, 30, size, capacity);
        InsertElement(&ptrArray, 40, size, capacity);
        InsertElement(&ptrArray, 50, size, capacity);
        PrintArray(ptrArray, size);
    
        DeleteElement(&ptrArray, 1, size);
        PrintArray(ptrArray, size);
        DeleteElement(&ptrArray, 2, size);
        PrintArray(ptrArray, size);
    
        DeleteDynamicArray(ptrArray, size);
    
        ptrArray = nullptr;
    
        return 0;
    }
    
    
    int* CreateDynamicArray(int capacity, int &size)
    {
        size = 0;
        return new int[capacity];
    }
    
    
    void DeleteDynamicArray(int* dynamicArray, int &size)
    {
        if (dynamicArray != nullptr) {
            delete[] dynamicArray;
            dynamicArray = nullptr;
        }
        size = 0;
    }
    
    
    void InsertElement(int** dynamicArray, int element, int &size, int &capacity)
    {
        if (size > capacity)
            capacity += 2;
        else
            capacity += 1;
        ResizeDynamicArray(dynamicArray, capacity);
        (*dynamicArray)[size] = element;
        size++;
    }
    
    
    void DeleteElement(int** dynamicArray, int elementIndex, int &size)
    {
        for (int i = elementIndex + 1; i < size; i++)
            (*dynamicArray)[i - 1] = (*dynamicArray)[i];
        size--;
    }
    
    
    void ResizeDynamicArray(int** dynamicArray, int newCapacity)
    {
        int *newArray = new int[newCapacity];
        for (int i = 0; i < newCapacity; i++) {
            newArray[i] = (*dynamicArray)[i];
        }
        if (*dynamicArray != nullptr)
            delete[] * dynamicArray;
        *dynamicArray = newArray;
    }
    
    
    void PrintArray(int *dynamicArray, int size)
    {
        for (int i = 0; i < size; i++) {
            std::cout << dynamicArray[i] << " ";
        }
        std::cout << std::endl;
    }