我有一个结构,其中包含指向其他结构的指针。举个例子,我的结构遵循类似的模式(尽管它们要复杂得多)。
typedef struct parent
{
string name;
int numOfKids;
child* children;
} parent
typedef struct child
{
string name;
details* information;
} child
typedef struct details
{
int age;
string bestFriend;
} details
要创建一组父母,请执行以下操作:
Parents * parents = new parents[numParents];
for(int i = 0; i< numParents; i++)
{
parents[i].children = new children[parents[i].numOfKids];
for (int j = 0; j < parents[i].numOfKids; j++)
{
parents[i].children[j].information = ( details* )malloc( sizeof( details ) );
memset( parents[i].children[j].details, 0, sizeof( details ) );
}
}
后来我试图像这样清理记忆:
void clearParents(parents** pParents, int numParents)
{
for(int i = 0; i< numParents)
{
for(int j = 0; j< pParents[i]->numOfKids; j++)
{
free(pParents[i]->children[j].details);
}
delete [] pParents[i]->children
delete( pParents[i])
}
}
这个clearParents函数似乎在第一个循环中正常工作,但在回到内循环时,它崩溃了
for (int j = 0; j < parents[i].numOfKids; j++)
错误:0xC0000005访问冲突读取位置0xCCCCCCD4
我猜这与我在父母阵列中释放/删除内存有关,同时还试图继续循环,但我不知道如何解决问题。
提前感谢您提供的任何见解
答案 0 :(得分:1)
您正在将new[]
与delete
混合。 pParents
是使用new[]
声明的,因此您需要在delete[]
的最外层循环结束时将其删除。您不应该尝试删除外部for循环中的每个元素。
答案 1 :(得分:1)
你对双指针pParents
感到困惑。您的释放模式与分配模式不匹配。我猜你真的想要这样的东西
void clearParents(parents* pParents, int numParents)
{
for(int i = 0; i< numParents; ++i)
{
for(int j = 0; j< pParents[i].numOfKids; j++)
{
free(pParents[i].children[j].details);
}
delete[] pParents[i].children;
}
delete[] pParents;
}