簡體   English   中英

動態內存尋址和釋放

[英]Dynamic memory addressing and deallocation

我正在嘗試解決我正在實現動態數組的網絡教程(未標記)的問題。 但是,它在兩個地方失敗:

  1. 我嘗試在函數ResizeDynamicArray(...)刪除動態數組的ResizeDynamicArray(...)
  2. 輸出的數據不正確。 我希望看到:

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

    ...但是我得到了這個:

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

解決方案的要求是:

  • 使用指向指針的指針而不是指向指針的指針 (順便說一句,我已經成功實現了指向指針解決方案的引用 ,但是我正在嘗試找出指向指針解決方案的指針
  • 不使用malloc / free
  • 不使用vector
  • 必須使用如下所示的聲明

有人可以建議我做錯了嗎?

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;
}

讓我們看一下InsertElement中的問題。 你有:

void InsertElement(int* dynamicArray, int element, int &size, int &capacity)
{
    ...
    ResizeDynamicArray(&dynamicArray, capacity);
    ...
}

在此函數中,您可以修改dynamicArray在函數中本地指向的內容。 這不會改變指針在調用函數中指向的內容。 結果,您有以下問題。

  1. 調用函數中的變量未指向您期望它具有的新分配的內存。
  2. 調用函數使用它沒有的內存,從而導致未定義的行為。
  3. 您有內存泄漏。 InsertElement返回后,函數中獲取的內存將立即丟失給程序。

解決該問題的方法是按引用傳遞指針。

void InsertElement(int*& dynamicArray, int element, int &size, int &capacity)
{
    ...
    ResizeDynamicArray(&dynamicArray, capacity);
    ...
}

我建議更改ResizeDynamicArray以也通過引用接受一個指針。 使用int**是C樣式,而不是C ++樣式。 如果您確實進行了更改,則可以使用

    ResizeDynamicArray(dynamicArray, capacity);

以上。

這是我對函數聲明的建議。 我認為您可以相應地更新實現。

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);

我注意到您在ResizeDynamicArray有一個錯誤。 您正在使用:

int *newArray = new int[newCapacity];
for(int i = 0; i < newCapacity; i++) {
    newArray[i] = (*dynamicArray)[i];
}

將值從舊數組復制到新數組。 但是,舊數組沒有新數組那么多的元素。 您最終會從不應訪問的內存中復制值。 有必要將舊容量作為參數傳遞給函數,以便您可以正確復制舊值。

感謝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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM