重新分配2D阵列并删除旧阵列

Re-Allocate 2D Array and delete old

本文关键字:阵列 删除 2D 新分配 分配      更新时间:2023-10-16

我有一个Graph类,它可以跟踪各种顶点和边。添加顶点时,我希望检查T* labels[]动态阵列的容量,并在需要更多空间时将容量增加一倍。当需要更多的空间时,我还将重新分配2D阵列,这样我就可以包括新顶点边的必要信息。我在add_vertex函数中通过检查顶点数量并将其与容量进行比较来实现这一点,并在满足条件时调用resize_edges()resize_vertex()

首先,我调用resize_edges()并开始分配一个更大的2D数组,我复制原始数组中的内容,然后将原始数组edges[][]设置为新的更大数组bool_new,然后是delete [] bool_new。接下来,我对我的labels[]做同样的操作。。。当我删除new_labels时,我的程序会崩溃。所有这些我都做对了吗?

template <typename T>
void Graph<T>:: resize_edges()
{
bool ** bool_new;
int new_cap = capacity*2;
bool_new = new bool*[new_cap];
for(int i = 0; i < new_cap ; i++)
{
bool_new[i] = new bool[new_cap];
}
for(int i = 0; i < capacity; i++)
{
for(int j = 0; j < capacity; j++)
{
bool_new[i][j] = edges[i][j];
}
}

edges = bool_new;

for(int i = 0 ; i < capacity ; i++) 
{
delete[] bool_new[i]; 
}
delete [] bool_new;
}
template <typename T>
void Graph<T>::resize_vertex()
{
T* new_labels;
int new_cap = capacity*2;
new_labels = new T[new_cap];
for(int i = 0; i < capacity; i ++)
{
new_labels[i] = labels[i];
}
labels = new_labels;
delete [] new_labels;
}

您显示的代码的一个主要问题是,您没有释放已分配的旧内存,而是释放了刚刚分配的新内存。

resize_edges功能中执行

edges = bool_new;

这将使edges指向的原始内存松动,这当然会导致内存泄漏。

但更糟糕的是,在那之后,您释放了刚刚分配的内存,这意味着edges将立即成为无效指针。

分配之前,您需要释放内存,分配之后,您需要保留新内存。

另一个问题是您没有更新capacity

您在resize_vertex函数中也有同样的问题。

谢谢。这是一个很好的复习。我现在有了这个功能来处理这一切。

template <typename T>
void Graph<T>:: resize()
{
bool ** bool_new;
T* new_labels;
new_labels = new T[capacity*2];
int new_cap = capacity*2;
bool_new = new bool*[new_cap];
for(int i = 0; i < new_cap ; i++)
{
bool_new[i] = new bool[new_cap];
}
for(int i = 0; i < capacity; i++)
{
for(int j = 0; j < capacity; j++)
{
bool_new[i][j] = edges[i][j];
}
}
for(int i = 0; i < capacity; i ++)
{
new_labels[i] = labels[i];
}
for(int i = 0 ; i < capacity; i++)
{
delete[] edges[i];
}
delete [] edges;
delete [] labels;
edges = bool_new;
labels = new_labels;
capacity *= 2;
}