重新分配2D阵列并删除旧阵列
Re-Allocate 2D Array and delete old
我有一个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;
}
相关文章:
- 从阵列C++中删除重复项
- 为什么删除分配的阵列会导致内存错误?
- 重新分配2D阵列并删除旧阵列
- 删除阵列时出现分段错误
- 阵列的临时存储如何用于C++中的删除恢复?
- 将C 中的每个指针删除作为阵列的指针安全吗?
- 唯一/共享 ptr 用于在数组超出范围后自动删除阵列
- C 在指针阵列中删除第一个元素,以效应后来的元素
- 在阵列C 中删除和转移剩余的元素
- 阵列旋转并删除
- 删除指向排序的字符串阵列的指针会在运行后会有一个错误
- C 对象阵列删除一个
- 复制动态阵列并使用过载的操作员删除原件
- C 删除并在2D动态阵列中删除和紧凑的行
- 在JNI呼叫中使用后,应删除/释放JarrayObject(字符串阵列)
- 删除阵列与指针
- 删除char阵列指针触发了一个神秘的断点
- 删除阵列错误
- 3D阵列删除C++的性能较慢
- Windows触发阵列删除的断点