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