动态内存寻址和释放
Dynamic memory addressing and deallocation
我正在尝试解决实现动态数组的网络教程(未标记)的问题。但是,它在两个地方失败了:
- 我尝试在函数
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
s
- 必须使用所示的声明
有人可以指出我做错了什么吗?
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
指向的内容。这不会改变指针在调用函数中指向的内容。因此,您会遇到以下问题。
- 调用函数中的变量没有指向您预期的新分配内存。
- 调用函数使用了它没有的内存,导致未定义的行为。
- 你有内存泄漏。一旦你 return from
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;
}
我正在尝试解决实现动态数组的网络教程(未标记)的问题。但是,它在两个地方失败了:
- 我尝试在函数
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
s - 必须使用所示的声明
有人可以指出我做错了什么吗?
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
指向的内容。这不会改变指针在调用函数中指向的内容。因此,您会遇到以下问题。
- 调用函数中的变量没有指向您预期的新分配内存。
- 调用函数使用了它没有的内存,导致未定义的行为。
- 你有内存泄漏。一旦你 return from
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;
}