[英]Dynamic memory addressing and deallocation
我正在嘗試解決我正在實現動態數組的網絡教程(未標記)的問題。 但是,它在兩個地方失敗:
ResizeDynamicArray(...)
刪除動態數組的ResizeDynamicArray(...)
輸出的數據不正確。 我希望看到:
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
在函數中本地指向的內容。 這不會改變指針在調用函數中指向的內容。 結果,您有以下問題。
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.