在C ++中删除多维结构会导致访问冲突

时间:2015-08-03 20:17:42

标签: c++ c arrays struct

我有一个结构,其中包含指向其他结构的指针。举个例子,我的结构遵循类似的模式(尽管它们要复杂得多)。

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

我猜这与我在父母阵列中释放/删除内存有关,同时还试图继续循环,但我不知道如何解决问题。

提前感谢您提供的任何见解

2 个答案:

答案 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;
}