C++ 删除C+中的多维结构+;导致访问违规

C++ 删除C+中的多维结构+;导致访问违规,c++,c,arrays,struct,C++,C,Arrays,Struct,我有一个结构,它有指向其他结构的指针。例如,我的结构遵循类似的模式(尽管它们要复杂得多) 要创建一组父对象,请执行以下操作: 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].numO

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

要创建一组父对象,请执行以下操作:

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 ) );
   }
}
Parents*Parents=新父母[numParents];
for(int i=0;i
后来我试图像这样清理记忆:

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])
     }
}
void clearParents(父项**pParents,int numParents)
{
对于(int i=0;inumOfKids;j++)
{
免费(pParents[i]->儿童[j].详细信息);
}
删除[]pParents[i]->子项
删除(第[i]条)
}
}
这个clearParents函数在第一个到的循环中似乎工作正常,但是在返回到内部循环时,它会崩溃

for (int j = 0; j < parents[i].numOfKids; j++)
for(int j=0;j
错误:0xC0000005访问冲突读取位置0xCCD4

我猜这与我释放/删除父数组中的内存有关,同时还试图继续循环,但我不确定如何解决这个问题


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

您正在将
新建[]
删除
混合使用
pParents
是使用
new[]
声明的,因此您需要使用
delete[]
在最外层for循环的末尾将其删除。您不应该试图删除外部for循环中的每个元素。

您已经被双指针
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;
}
void clearParents(父项*pParents,int numParents)
{
对于(int i=0;i
omg为什么所有的数组和
new
以及指针?是什么设计决策导致了这种情况?调试!!启动调试器,逐行检查代码的每一行,观察变量是如何变化的。在你做完这件事之前不要在这里问!不要将
new[]
delete
@LightnessRacesinOrbit混为一谈遗憾的是,这不是我的决定。我实际上使用的是NvAPI,结构代表了一个由Nvidia构建的结构。如果你想看看我的实际分配情况,你可以在这里看到一个例子:不幸的是,Nvidia没有提供任何关于如何在完成后释放内存的文档,我不想把整个结构放在这里,因为如果你以前没有见过它,它会让你感到害怕。如果你使用std::vector,你的很多问题都会消失。很遗憾,我不能更改双指针,因为这只是我真实代码的一个示例。正如我在前面的评论中提到的,我实际上使用的是Nvidia的API,这些结构是Nvidia调用所需结构的简化版本。在双指针仍然存在的情况下,delete[]pParents[i]是否仍然有效?@LightnessRacesinOrbit示例中的方法头有“parents*pParents”,在我的示例中有“parents**pParents”。也许我有点困惑,但在我看来,他正在删除双指针,而不是上次的删除,将所有的“->”s变成“.”s如果设计由我决定,我会这样做,但双指针超出了我的权限hands@TrolliOlli是的,我现在明白了。虽然我仍然不明白你为什么认为你“需要”双指针。只需在函数中取消引用一次…………即使使用双指针
delete[]pParents[i]
也是错误的,因为您只分配了一次,但删除了
numParents
次。这就是我所说的你的分配模式与分配模式不匹配的意思。如果必须使用双指针,则可能需要
delete[]*pParents?免费((*pParents)[i].儿童[j].详情)
删除[](*pParents)[i]但真的只是猜测。@john哦,好吧,这更有意义!但是,我仍然得到了错误(即使我去掉了整行),因此错误似乎来自子项或子项[j]的内部删除之一。详细信息。
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;
}