我有一个C++中的二维指针矩阵,例如:
在设置A0的值后,我将编写一个函数,根据随机数是0还是1来决定是否删除A中的M-2行。
现在,在包含A内存分配的主函数中,我想释放/删除为A分配的内存。我可以使用以下代码:
我的问题是,我不知道A是否删除了M-2行。因此,如果我的随机数是0,上面的代码显然会删除所有内存。这意味着,只有在delete_or_not函数中删除M-2行时,上面的代码才会正确地删除内存。如何完美地删除A矩阵。谢谢。
最终,我的完整代码是:
typedef unsigned char U8;
typedef unsigned int U32;
int M=10;
int m_L=8;
U8** A = new U8*[M];
for (U32 i = 0; i < M; ++i)
{
A[i] = new U8[m_L];
}
在设置A0的值后,我将编写一个函数,根据随机数是0还是1来决定是否删除A中的M-2行。
void delete_or_not(U8** A,int M)
{
if (rand_num==1){
for (U32 index = M-2; index < M; ++index){
delete[] A[index];
}
}
}
现在,在包含A内存分配的主函数中,我想释放/删除为A分配的内存。我可以使用以下代码:
//free A matrix
for (U32 i = 0; i < M; ++i)
{
if (i < m_L)
{
delete[] A[i];
A[i] = NULL;
}
}
delete[] A;
A = NULL;
我的问题是,我不知道A是否删除了M-2行。因此,如果我的随机数是0,上面的代码显然会删除所有内存。这意味着,只有在delete_or_not函数中删除M-2行时,上面的代码才会正确地删除内存。如何完美地删除A矩阵。谢谢。
最终,我的完整代码是:
typedef unsigned char U8;
typedef unsigned int U32;
int M=10;
int m_L=8;
U8** A = new U8*[M];
for (U32 i = 0; i < M; ++i)
{
A[i] = new U8[m_L];
}
delete_or_not(A,M);
//free A matrix
//Way 1: will miss M-2 row if delete_or_not function did not delete 2 rows.
// It only correct if rand_num=1
for (U32 i = 0; i < M; ++i)
{
if (i < m_L)
{
delete[] A[i];
A[i] = NULL;
}
}
delete[] A;
A = NULL;
//Way 2- It will correct if the size of A is M by M
for (U32 i = 0; i < M; ++i)
{
delete[] A[i];
A[i] = NULL;
}
delete[] A;
A = NULL;
U32
、U8
、M
、m_L
等更易读的名称可供选择。 - Paul Evansnew
或new[]
,这样就不必担心它们了。 - n. m.U32 index = M-2
作为索引的初始化。 - Support Ukraine